2012-02-22 24 views
6

Miałem zadanie poprzedzające rozmowę kwalifikacyjną, które ukończyłem i rozwiązanie działa, jednak zostałem oceniony i nie otrzymałem wywiadu z powodu użycia TADODataset. Zasadniczo zaimportowałem plik CSV, który zapełnił zbiór danych, dane musiały zostać przetworzone w określony sposób, więc użyłem Filtrowania i Sortowania zbioru danych, aby upewnić się, że dane zostały uporządkowane w taki sposób, w jakim chciałem, a następnie zrobiłem przetwarzanie logiczne w pętli while. Otrzymane opinie mówiły, że jest to złe, ponieważ w przypadku dużych plików byłoby bardzo wolne.importowanie i przetwarzanie danych z pliku CSV w Delphi

Moje główne pytanie dotyczy sytuacji, w której użycie zbioru danych w pamięci jest powolne w przypadku przetwarzania dużych plików, co byłoby lepszym sposobem uzyskania dostępu do informacji z pliku csv. Czy powinienem używać list ciągów lub czegoś w tym stylu?

+0

Myślę, że wykonałeś dobrą robotę w ramach podanej specyfikacji. Duże pliki? Użyj więc alternatywnego rozwiązania bazodanowego, które nie jest oparte na pamięci - Twoje rozwiązanie jest skalowane bez zmiany czegokolwiek innego. – mj2008

+0

Dziękuję mj2008 Tak mi się zdawało w czasie pisania, a także starałem się napisać rozwiązanie w sposób bardzo defensywny, ale biorąc pod uwagę odpowiedź Dorina poniżej, mogę teraz zobaczyć, dlaczego ankieter chciałby to zrobić w inny sposób. – Mattgb

+0

Zgadzam się z @ mj2008. powiązanie 'CSV' z' ADO' jest bardzo dobrą odpowiedzią. Moje instynktowne rozwiązanie byłoby takie samo. Jeśli wiesz, jak radzić sobie z plikami 'CSV' z' TADODataset' z pewnością wiesz jak "low-tech" przeczytaj wiersz pliku tekst po linii ... – kobik

Odpowiedz

3

To naprawdę zależy od tego, jak "duże" i dostępne zasoby (w tym przypadku RAM) do zadania.

"Otrzymane informacje zwrotne mówiły, że było to złe, ponieważ dla dużych plików byłoby bardzo wolne."

Pliki CSV są zwykle używane do przenoszenia danych (w większości przypadków napotkanych plików są ~ 1MB + do ~ 10MB, ale to nie oznacza, że ​​inne nie zrzuciły więcej danych w formacie CSV) bez obaw również dużo (jeśli w ogóle) o import/eksport, ponieważ jest bardzo uproszczony.

Załóżmy, że masz plik 80MB CSV, teraz to jest plik, który chcesz przetworzyć w kawałki, w przeciwnym razie (w zależności od przetworzenia) można jeść setki MB pamięci RAM, w tym przypadku, co mogę zrobić, to:

while dataToProcess do begin 
    // step1 
    read <X> lines from file, where <X> is the max number of lines 
    you read in one go, if there are less lines(i.e. you're down to 50 lines and X is 100) 
    to process, then you read those 
    // step2 
    process information 
    // step3 
    generate output, database inserts, etc. 
end; 

W powyższym przypadku nie ładujesz 80 MB danych do pamięci RAM, ale tylko kilkaset KB, a reszta służy do przetwarzania, tj. Listy połączone, dynamiczne kwerendy wstawiania (wstawianie wsadowe) itp.

"... jednak zostałem oznaczony i nie dostałem wywiadu z powodu użycia TADODatasetu."

Nie jestem zaskoczony, prawdopodobnie chcieli sprawdzić, czy jesteś w stanie stworzyć algorytm (y) i dostarczyć proste rozwiązania na miejscu, ale bez używania "gotowych" rozwiązań.

Prawdopodobnie myślą o tym, że używają dynamicznych tablic i tworzą jeden (lub więcej) algorytm (y) sortowania.

"Czy powinienem użyć list ciągów lub coś w tym stylu?"

Odpowiedź mogła być taka sama, znowu, myślę, że chcieli zobaczyć, jak "pracujesz".

+1

W moim biurze zajmujemy się co miesiąc plikiem 4 GB + CSV (wygenerowanym gdzie indziej i udostępnionym do pobrania w formacie zip). Nie trzeba dodawać, że ADODataSet lub ClientDataSet nie jest tutaj dobrym rozwiązaniem. :) –

+0

Dzięki za odpowiedź Dorin, używając dynamicznych tablic i algorytmów sortowania po prostu nie wszedł w mój proces myślowy. Wydaje mi się, że pracowałem z bazami danych Ado i SQL zbyt długo i może potrzebuję spojrzeć na rozwiązywanie problemów, aby poszerzyć moją wiedzę. – Mattgb

+0

@KenWhite Uważam, że trochę trudno uwierzyć, że ktoś utworzyłby plik CSV o pojemności 4 GB, ale to nie znaczy, że nie jest to możliwe, więc żart czy? Szczerze mówiąc, nigdy nie słyszałem o ~ 100MB CSV ... jest to również niepraktyczne ... – ComputerSaysNo

0

Ankieter miał rację.

Prawidłowe, skalowalne i najszybsze rozwiązanie na każdym nośniku w górę to użycie "sortowania zewnętrznego".

"Sortowanie zewnętrzne" jest procesem dwustopniowym, pierwszym etapem jest dzielenie każdego pliku na mniejsze i łatwiejsze do zarządzania pliki. Drugim etapem jest scalenie tych plików z powrotem w pojedynczy posortowany plik, który następnie może być przetwarzany wiersz po linii.

Jest niezwykle wydajny w każdym pliku CSV z ponad 200 000 linii. Ilość pamięci, którą uruchamia proces, może być kontrolowana, co eliminuje ryzyko wyczerpania pamięci.

Wdrożyłem wiele takich procesów sortowania iw Delphi poleciłbym kombinację klas TStringList, TList i TQueue.

Powodzenia

Powiązane problemy