Article View: pl.comp.lang.delphi.bazy-danych
Article #82245Re: zmiana klucza z int na string
From: wloochacz
Date: Thu, 31 Jul 2014 07:46
Date: Thu, 31 Jul 2014 07:46
72 lines
4889 bytes
4889 bytes
W dniu 2014-07-31 00:59, Arivald pisze: > On 2014-07-30 20:25, Ciekawy wrote: >> >>> A co do takiego pola geometrii, lub wręcz całych rekordów bez PKEYa, to >>> o ile dane się nie duplikują to jako PKEY możesz użyć skrótu SHA-1 z >>> całego wiersza (160 bitów, więcej niż GUID) >>> >> Przemyślałem sprawę, muszę zrobić sobie listę buforującą klucze. Sprawę >> załatwia mi TList<string> Index to dla mnie klucz Integer. > > Daj spokój TList. To się nie nadaje na cache bazy danych, już przy kilku > tysiącach rekordów TDictionary będzie ogólnie szybsze, biorąc pod uwagę > szukanie, sortowanie i realokacje pamięci, drogie dla TList. Dla > milionów rekordów TList nie ma żadnych szans. Hola, hola! Sprawdzałeś wyszukiwanie za pomocą BinarySearch (IndexOf wyszukuje sekwencyjnie - i dziwicie się, że to jest wolne...)? Sprawdzałeś TList z implmentacją IEqualityComparer (porównywacz z hashem, używany w TDictionary)? Problem wykracza poza proste używanie obiektów i komponentów. A moim zdaniem - wykracza poza (ale chyba niewiele) dyskusje na grupie, wszyscy za mało wiemy o otoczeniu problemu. Efekt może być taki, że nasze rady to zdadzą się psu na budę, bo może wystarczy zastosować jakiś sprytny algorytm i po sprawie. Ale tego nie wiem. >> Jedyny temat >> to to, że TList jest wolniejsza od TDictionary przy sprawdzaniu czy dany >> element nie znajduje się na liście, a musi sprawdzić zanim go doda: >> TDictionary<>.containKey >> TList<>.IndexOf <>-1. (dla 30 000 rekordów dla TDictionary to 1 sek dla >> TList 7 sek). >> Z kolei w TList wygodnym jest to że mogę dobrać się do elementu za >> pomocą jego indexu. TDictionary takiej opcji nie posiada. > > Za to posiada dostęp po kluczu, o w miarę stałej prędkości. > Także stały czas dodawania/usuwania rekordu. > > W TList problemem dostępy po kluczu jest nie tylko czas indexof(), ale > też jego charakterystyka, ponieważ generalnie najczęściej czyta się czy > modyfikuje ostatnio dodane rekordy. > >> >> Co do stosowania klucza typu Integer, zostawiam to u siebie, powyższe >> rozwiazanie chcę stosować tam gdzie takiego klucza nie ma. >> >> Pozdrawiam Ciekawy. >> >> Może jest coś co łączy w moim przypadku atuty i TDictionary<> i TList<>? > > Ja bym zrobił zupełnie inaczej. > Robisz sobie embedded SQLite (lub firebird), i składujesz tam dane, i > korzystasz z potęgi SQLa + TDataSet. Oczywiście będzie to > nieporównywalnie wolniejsze niż iteracja po TDictionary czy TList... Ale > SQL załatwia Ci od ręki filtrowanie, sortowanie i łączenie danych, na > pewno szybciej niż byś to wydziergał na TList. To samo załatwia TList (filtrowanie, sortowanie), w standardzie od Spring4D, a nie w standardzie własne - ale to proste do napisania jest (iteracja + sprawdzenie warunku za pomocą metody anonimowej). Szybsze niż wydzierganie bazy danych w SQLite... Ale ważniejsze jest to, że będzie to WIELOKROTNIE szybsze od bazy danych. Robiłem coś podobnego jakiś czas temu - po dwóch dniach walki okazało się, że baza danych to wolny muł... > SQLite umożliwia tworzenie tabel "tylko w pamięci", więc jak masz > gigabajty ramu do dyspozycji to operacje na dysku nie będą Cię spowalniać. Moim zdaniem, trzeba trochę pokombinować, żeby było dobrze. Samo "weź SQLLite i będzie świetnie" lub "TDIctionary załatwi srpawę" to takie rady w stylu wujek dobra rada. -- wloochacz
Technical Details
Message-ID:
<53d9f454$0$2145$65785112@news.neostrada.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!newsfeed2.atman.pl!newsfeed.atman.pl!goblin2!goblin.stu.neva.ru!xlned.com!feeder1.xlned.com!feeder1.cambriumusenet.nl!feed.tweaknews.nl!209.197.12.246.MISMATCH!nx02.iad01.newshosting.com!newshosting.com!newsfeed.neostrada.pl!unt-exc-02.news.neostrada.pl!unt-spo-b-01.news.neostrada.pl!news.neostrada.pl.POSTED!not-for-mailReferences:
<lr8ptb$lcj$1@node2.news.atman.pl> <53d8235b$0$2154$65785112@news.neostrada.pl> <lra9bd$1qg$1@node2.news.atman.pl> <lraebq$6oo$1@news.dialog.net.pl> <lrb1c6$q55$1@node2.news.atman.pl> <lrb4aa$h0d$1@news.dialog.net.pl> <lrbdb8$p18$1@node1.news.atman.pl> <lrbtbg$su1$1@news.dialog.net.pl>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!newsfeed2.atman.pl!newsfeed.atman.pl!goblin2!goblin.stu.neva.ru!xlned.com!feeder1.xlned.com!feeder1.cambriumusenet.nl!feed.tweaknews.nl!209.197.12.246.MISMATCH!nx02.iad01.newshosting.com!newshosting.com!newsfeed.neostrada.pl!unt-exc-02.news.neostrada.pl!unt-spo-b-01.news.neostrada.pl!news.neostrada.pl.POSTED!not-for-mail Date: Thu, 31 Jul 2014 09:46:01 +0200 From: wloochacz <wloochacz@no.spam.gmail.com> User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko/20100101 Thunderbird/24.6.0 MIME-Version: 1.0 Newsgroups: pl.comp.lang.delphi.bazy-danych Subject: Re: zmiana klucza z int na string References: <lr8ptb$lcj$1@node2.news.atman.pl> <53d8235b$0$2154$65785112@news.neostrada.pl> <lra9bd$1qg$1@node2.news.atman.pl> <lraebq$6oo$1@news.dialog.net.pl> <lrb1c6$q55$1@node2.news.atman.pl> <lrb4aa$h0d$1@news.dialog.net.pl> <lrbdb8$p18$1@node1.news.atman.pl> <lrbtbg$su1$1@news.dialog.net.pl> In-Reply-To: <lrbtbg$su1$1@news.dialog.net.pl> Lines: 72 Message-ID: <53d9f454$0$2145$65785112@news.neostrada.pl> Organization: Telekomunikacja Polska NNTP-Posting-Host: 83.11.128.64 X-Trace: 1406792788 unt-rea-a-02.news.neostrada.pl 2145 83.11.128.64:21957 X-Complaints-To: abuse@news.neostrada.pl Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit