Doradztwo w zakresie obsługi dużych ilości danych

Więc mam "dużą" liczbę "bardzo dużych" plików ASCII danych liczbowych (w sumie gigabajtów), a mój program będzie musiał przetworzyć całość sekwencyjnie co najmniej raz.

Jakieś rady dotyczące przechowywania/ładowania danych? Myślałem o konwersji plików do binarnych, aby je zmniejszyć i szybsze ładowanie.

Czy mam wczytać wszystko do pamięci na raz?
Jeśli nie, czy otwarcie jest dobrym sposobem na częściowe ładowanie danych?
Jakie są niektóre Java-istotne wskazówki dotyczące wydajności?

Author: Brian Tompsett - 汤莱恩, 2008-09-18

11 answers

Więc co jeśli przetwarzanie wymaga przeskakiwania w danych dla wielu plików i wielu buforów? Czy ciągłe otwieranie i zamykanie plików binarnych będzie kosztowne?

Jestem wielkim fanem 'memory mapped i/o', aka 'direct byte buffers'. W języku Java nazywane sąmapowane bufory bajtowe są częścią Javy.nio. (Zasadniczo mechanizm ten wykorzystuje system przywoływania pamięci wirtualnej systemu operacyjnego do "mapowania" plików i prezentowania programowo jako bufory bajtowe. System operacyjny będzie zarządzał przesuwaniem bajtów do/z dysku i pamięci automatycznie i bardzo szybko.

Sugeruję takie podejście, ponieważ a) działa dla mnie i B) pozwoli Ci skupić się na algorytmie i pozwolić JVM, OS i sprzęt zająć się optymalizacją wydajności. Wszyscy często wiedzą, co jest najlepsze bardziej niż my, skromni Programiści. ;)

Jak użyłbyś MBBs w swoim kontekście? Wystarczy utworzyć MBB dla każdego z plików i Czytaj jak uważasz za stosowne. Będziesz musiał tylko przechowywać swoje wyniki. .

BTW: z jaką ilością danych masz do czynienia, w GB? Jeśli jest więcej niż 3-4GB, to nie będzie to działać na komputerze 32-bitowym, ponieważ implementacja MBB jest umieszczana w adresowalnej przestrzeni pamięci przez architekturę platformy. 64-bitowa maszyna i system operacyjny zabierze cię do 1TB lub 128tb danych do mapowania.

Jeśli myślisz o wydajności, poznaj Kirka Pepperdine 'a (nieco znanego guru wydajności Javy.) Jest związany ze stroną internetową, www.JavaPerformanceTuning.com, który ma więcej szczegółów MBB: Wskazówki dotyczące wydajności NIO i inne rzeczy związane z wydajnością Javy.

 6
Author: Stu Thompson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-24 17:00:32

Możesz rzucić okiem na wpisy w Wide Finder Project (Wykonaj wyszukiwanie w Google dla "wide finder" java ).

Wide finder polega na odczytywaniu wielu wierszy w plikach dziennika, więc spójrz na implementacje Javy i zobacz, co tam działało, a co nie.

 2
Author: Matt Quail,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-18 07:00:23

Możesz przekonwertować na binarne, ale wtedy masz kopie danych 1+ coś, jeśli chcesz zachować oryginał.

Praktyczne może być zbudowanie pewnego rodzaju indeksu na oryginalnych danych ascii, tak aby w razie potrzeby przechodzić przez dane ponownie, można to zrobić szybciej w kolejnych czasach.

Aby odpowiedzieć na twoje pytania w kolejności:

Czy mam wczytać wszystko do pamięci na raz?

Nie, jeśli nie musisz. w przypadku niektórych plików możesz być w stanie, ale jeśli przetwarzasz sekwencyjnie, po prostu zrób jakiś buforowany odczyt rzeczy jeden po drugim, przechowując wszystko, czego potrzebujesz po drodze.

Jeśli nie, to czy otwarcie jest dobrym sposobem na częściowe wczytywanie danych?

BufferedReaders / etc jest najprostszy, chociaż można zajrzeć głębiej do FileChannel / etc, aby użyć memorymapped I / O, aby przejść przez okna danych na raz.

Jaka jest wydajność Javy napiwki?

To naprawdę zależy od tego, co robisz z danymi!

 1
Author: John Gardner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-17 21:21:20

Bez żadnego dodatkowego wglądu w jaki rodzaj przetwarzania się dzieje, oto kilka ogólnych myśli z czasów, gdy wykonałem podobną pracę.

  1. Napisz prototyp aplikacji (może nawet "jedną do wyrzucenia"), która wykona dowolną operację na twoim zestawie danych. Zobaczymy jak szybko pójdzie. Jeśli najprostsza, najbardziej naiwna rzecz, o której możesz pomyśleć, jest akceptowalnie szybka, nie martw się!

  2. Jeśli naiwne podejście nie zadziała, rozważ wstępne przetwarzanie danych w taki sposób że kolejne biegi będą przebiegać w akceptowalnym czasie. Wspominasz o konieczności" skakania " w zestawie danych całkiem sporo. Jest jakiś sposób, żeby to wstępnie przetworzyć? Jednym z etapów wstępnego przetwarzania może być wygenerowanie jeszcze większej liczby danych-danych indeksowych-które zapewniają dokładne informacje o lokalizacji w bajtach o krytycznych, niezbędnych sekcjach zestawu danych. Następnie główny proces przetwarzania może wykorzystać te informacje, aby przejść bezpośrednio do niezbędnych danych.

Podsumowując, mój podejście byłoby spróbować czegoś prostego teraz i zobaczyć, jak wygląda wydajność. Może będzie dobrze. W przeciwnym razie przyjrzyj się przetwarzaniu danych w wielu krokach, oszczędzając Najdroższe operacje na rzadkie przetwarzanie wstępne.

Nie "ładuj wszystkiego do pamięci". Wystarczy wykonać dostęp do plików i pozwolić pamięci podręcznej strony dysku systemu operacyjnego zdecydować, kiedy rzeczywiście wyciągniesz rzeczy bezpośrednio z pamięci.

 1
Author: shadit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-17 21:22:21

To w dużej mierze zależy od danych w pliku. Duże ramki mainframe od dawna przetwarzają sekwencyjne dane, ale zwykle nie używają do nich dostępu losowego. Po prostu ciągną go w linii na raz i przetwarzają tyle, zanim kontynuują.

W przypadku dostępu losowego często najlepiej jest budować obiekty z opakowaniami buforującymi, które wiedzą, gdzie w pliku znajdują się dane, które muszą skonstruować. W razie potrzeby odczytują te dane i konstruują się. W ten sposób, gdy pamięć jest tight możesz po prostu zacząć zabijać rzeczy, nie martwiąc się zbytnio o to, że nie będziesz w stanie odzyskać tego później.

 1
Author: Rick Minerich,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-18 14:12:55

Naprawdę nie dałeś nam wystarczająco dużo informacji, aby ci pomóc. Czy musisz załadować każdy plik w całości, aby go przetworzyć? Czy możesz przetwarzać go linia po linii?

Ładowanie całego pliku na raz może spowodować słabą wydajność nawet dla plików, które nie są zbyt duże. Najlepszym rozwiązaniem jest zdefiniowanie rozmiaru bufora, który działa dla Ciebie i odczytywanie / przetwarzanie danych w buforze na raz.

 0
Author: Johnny Bravado,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-17 21:10:55

Uważam, że Informatica jest wyjątkowo użytecznym narzędziem do przetwarzania danych. Dobrą wiadomością jest to, że nowsze wersje umożliwiają nawet transformacje Javy. Jeśli masz do czynienia z terabajtami danych, może nadszedł czas, aby wybrać najlepsze w swojej klasie narzędzia ETL.

Zakładam, że chcesz zrobić coś z wynikami przetwarzania tutaj, na przykład przechowywać je gdzieś.

 0
Author: DudeMonkey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-17 21:11:55

Jeśli Twoje dane liczbowe są regularnie próbkowane i musisz zrobić losowy dostęp, rozważ, aby zapisać je w quadtree.

 0
Author: Hallgrim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-17 21:12:06

Zalecam silne wykorzystanie wyrażeń regularnych i zajrzenie do" nowego " pakietu IO nio dla szybszego wprowadzania danych. Wtedy powinno pójść tak szybko, jak można realistycznie oczekiwać gigabajtów danych, aby przejść.

 0
Author: Mike Pone,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-17 21:23:41

Jeśli to w ogóle możliwe, Pobierz dane do bazy danych. Następnie możesz wykorzystać wszystkie dostępne tam funkcje indeksowania, buforowania, przypinania pamięci i inne.

 0
Author: Mike McAllister,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-18 14:00:46

Jeśli chcesz uzyskać dostęp do danych więcej niż jeden raz, załaduj je do bazy danych. Większość baz danych ma jakiś rodzaj narzędzia do masowego ładowania. Jeśli wszystkie dane mieszczą się w pamięci, a nie musisz ich trzymać lub uzyskiwać do nich tak często dostępu, prawdopodobnie możesz napisać coś prostego w Perlu lub ulubionym języku skryptowym.

 0
Author: runrig,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-19 21:05:40