Neuroróżnorodność w miejscu pracy
12.02.20242 min
Bulldogjob

Bulldogjob

Java przetwarza miliard wierszy danych w 1.5 sekundy

Skąd nagle wiadomo, że Java jest w stanie przetworzyć miliard wierszy danych w 1.5s? Poszło o One Billion Row Challenge.

Java przetwarza miliard wierszy danych w 1.5 sekundy

W programerskim świecie online ostatnio zawrzało. Okazało się, że Java może przetworzyć plik zawierający miliard wierszy danych w zaledwie 1.5 sekundy. Okazało się to podczas trwania wyzwania One Billion Row Challenge. Co to takiego? Już tłumaczymy.

Wprowadzenie do One Billion Row Challenge

Inicjatywa znana jako One Billion Row Challenge (1BRC), została zapoczątkowana przez Gunnara Morlinga, Senior Software Engineera w firmie Decodable. Wyzwanie polegało na stworzeniu w Javie programu, który przetworzy plik testowy z miliardem linii. Każda zawierała nazwę stacji pogodowej i zanotowaną temperaturę, np:

Hamburg;12.0
Bulawayo;8.9
Palembang;38.8​
Celem było obliczenie minimum, maksimum i średniej temperatury dla każdej stacji i zwrócenie wyniku w kolejności alfabetycznej. Do dyspozycji uczestników wyzwania był serwer Hetzner AX161 - 32 rdzenie, 128 GB RAM, ale mogli skorzystać tylko z 8 rdzeni serwera.

Morling zaproponował to wyzwanie, aby zainspirować programistów do eksplorowania tego, co ma do zaoferowania Java. W rezultacie pojawiło się wiele różnych podejść, które w końcu doprowadziły do osiągnięcia wyniku 1.5 sekundy przetwarzania miliarda wierszy danych.

Techniki osiągnięcia wydajności

Aby zrozumieć, jak Javie udało się osiągnąć tak szybkie przetwarzanie danych, warto przyjrzeć się kilku kluczowym technikom wykorzystanym przez koderów podczas tego wyzwania.

Podział na fragmenty i przetwarzanie równoległe

Jedną z kluczowych technik było podzielenie pliku na mniejsze fragmenty, które następnie były przetwarzane równolegle. Dzięki temu każdy fragment mógł być przetwarzany niezależnie, co umożliwiło efektywne wykorzystanie dostępnych zasobów sprzętowych i przyspieszenie całego procesu.

Optymalizacje alokacji pamięci

Programiści stosowali również optymalizacje pamięci, takie jak minimalizowanie alokacji i dealokacji pamięci oraz wykorzystanie struktur danych zaprojektowanych pod kątem minimalnego zużycia pamięci. Dzięki temu udało się zmniejszyć narzut związany z zarządzaniem pamięcią i zoptymalizować wydajność programu.

Algorytmy bez odgałęzień

W celu zminimalizowania opóźnień związanych z przewidywaniem skoków (branch prediction), programiści stosowali algorytmy bez odgałęzień, które eliminują lub minimalizują skoki warunkowe w kodzie. Dzięki temu udało się zwiększyć przepustowość programu i osiągnąć lepszą wydajność.

Wszystkie topowe implementacje używały Unsafe, a najszybsza implementacja bez niego dała radę przetworzyc plik w 2.997s. Dodatkowo większość topowych rozwiązań to GraalVM. Najlepsza z nich przetworzyła plik w 1.535s.

Podsumowanie

Najnowsze osiągnięcie Javy to nie tylko imponujący wynik techniczny, ale także inspirujący przykład odkrywania ukrytego potencjału, jakim dysponują języki programowania. W liczbie mnogiej, bo oczywiście większość zgłoszeń dotyczyła Javy, ale również wielu programistów innych języków też zaponowało swoje implementacje (co prawda poza konkursem). Tu znalazły się języki od COBOL-a i Fortrana do Rusta i C, a nawet AWK czy rozwiązania w MySQL czy Postgresie.

<p>Loading...</p>