- admin
- Allowed memory size exhausted, chunkowanie danych, duże pliki, dzielenie plików, eksport dokumentów, import dokumentów, optymalizacja wydajności, pamięć PHP
- 0 Comments
- 17002 Views
Wprowadzenie
Podczas jednej z realizacji stanęliśmy przed wyzwaniem: system miał umożliwiać import i eksport dużych zbiorów dokumentów. Na pierwszy rzut oka – brzmi prosto. Ale kiedy pierwsze testy poszły w ruch, okazało się, że nasze pliki rosły do setek megabajtów, a PHP z gracją wyświetlał komunikat o przekroczonej pamięci (Allowed memory size exhausted).
Problem
Wersja 1.0 zakładała, że wszystkie dokumenty będą ładowane do pamięci jednocześnie. Brzmiało to logicznie: wczytać, przetworzyć i wyeksportować.
Jednak przy plikach zawierających tysiące dokumentów okazało się to katastrofą. PHP (które standardowo ma ograniczenie pamięci do 128 MB lub 256 MB) po prostu nie radził sobie z takim obciążeniem.
Efekt? Proces importu kończył się w połowie, a eksport wyłączał serwer.
Rozwiązanie
Po krótkiej burzy mózgów zdecydowaliśmy się na chunkowanie danych – czyli dzielenie dużego pliku na mniejsze porcje. Optymalnym wyborem okazało się 200 dokumentów w jednej paczce.
Dzięki temu:
- procesy importu i eksportu stały się stabilne,
- pamięć PHP przestała być wąskim gardłem,
- system mógł przetwarzać dowolnie duże pliki – wystarczyło rozbić je na porcje.
Przykładowa implementacja
Oto uproszczony fragment kodu w PHP, pokazujący jak wyglądało dzielenie dokumentów na paczki po 200 elementów:
$documents = loadDocumentsFromFile($filePath);
$chunkSize = 200;
$chunks = array_chunk($documents, $chunkSize);
foreach ($chunks as $index => $chunk) {
processDocuments($chunk);
echo "Przetworzono paczkę nr " . ($index + 1) . "\n";
}
Dzięki temu zamiast jednorazowego wczytania np. 5000 dokumentów, system wykonywał 25 mniejszych kroków, a pamięć była wykorzystywana w granicach rozsądku.
Ciekawostki (Fun facts)
- Pierwsza wersja eksportu działała tak długo, że jeden z developerów zdążył… zaparzyć kawę, wypić i zrobić drugą rundę zanim proces się skończył ☕.
- Zmiana logiki na chunkowanie skróciła czas eksportu o ponad 60% – mniejsze porcje oznaczały także szybsze zwalnianie pamięci.
- W praktyce użytkownik nawet nie zauważa, że plik jest dzielony – cały proces wygląda tak, jakby był ciągły.
Efekt końcowy
Po wprowadzeniu chunkowania:
- system stał się stabilny nawet dla plików o rozmiarze kilkuset MB,
- zniknęły błędy pamięci,
- klienci mogli w końcu bez problemu migrować swoje dokumenty między systemami.
Chcesz wdrożyć podobne rozwiązanie w swojej firmie?
Przekładamy wiedzę z bloga na konkretne działania biznesowe: analizę, wdrożenie i rozwój. Sprawdź usługę i zobacz, jak możemy pomóc także u Ciebie.
