2012-12-22 18 views
7

Mam bazę danych oracle, gdzie przechowywana jest duża ilość danych biometrycznych, takich jak HRV i EKG. Muszę pokazać te dane dla każdego użytkownika w arkuszu programu Excel. Ale te dane są tak duże, nawet dla jednego użytkownika dostajemy ponad 1,000,000 rekordów. Obecnie jest 100 użytkowników.Używanie php do zapisywania dużej ilości danych w Excelu bez błędu limitu pamięci

Co robie to:

  1. mogę wykonać zadanie CRON za pomocą wiersza polecenia dla tego samego, co ja opracowany w Zend Framework.
  2. Upewniam się, że ten CRON się nie nakłada.
  3. Otrzymuję wszystkie dane z bazy danych oracle dla każdego użytkownika, jeden po drugim, a następnie zapisuję to w tablicy.
  4. Gdy otrzymam dane dla wszystkich użytkowników, używam biblioteki phpexcel do generowania arkusza Excela.

    struktura arkusza Excel

    • UID 1/UID/2 UID/3 ----------- nta
    • danych | dane | danych |
    • dane | dane | dane |
    • |
    • nta

problemu:

PHP trwa 1,5 GB RAM i przechowuje dane w tablicy i przesyła do funkcji interakcji z phpexcel ale biblioteki trwa 3-4 godziny a następnie pojawia się błąd "Fatal: Memory limit". Mój system ma tylko 2 GB pamięci RAM.

Co należy zrobić, aby zoptymalizować mój kod, aby obsłużyć dane tego rozmiaru i wyświetlając te same informacje w formacie programu Excel lub muszę zwiększyć RAM?

+0

Co użytkownicy robią z dużą ilością danych w Excelu? –

+0

Ci użytkownicy to w zasadzie badacze. Być może wykorzystają te dane w programie Matlab lub mogą go użyć do stworzenia lepszych algorytmów. Jest tak wiele możliwości. Zasadniczo moje pytanie dotyczyło znalezienia zoptymalizowanego sposobu radzenia sobie z tego rodzaju scenariuszem. – techgyani

Odpowiedz

7

Rozważ użycie PHP tylko do wyrzucenia pewnego rodzaju pliku CSV z możliwością odczytu w formacie Excel zawierającego dane wynikowe. (Chodzi o to, że nie pisałbyś do Excela przez PHP - z powodu ograniczeń, których doświadczasz).

Możesz poprosić o wygenerowanie pliku php za pomocą czegoś w rodzaju Powershell, a następnie wybrać opcję Powershell lub inny skrypt, aby otworzyć plik csv bezpośrednio w programie Excel, a następnie zapisać jako plik xlsx.

Albo możesz mieć linię poleceń php wykonać wywołanie "systemowe" i wykonać krok skryptu, który otwiera csv bezpośrednio do Excela, a następnie zapisuje go jako xlsx.

+0

Twoje dane będą przechowywane w CSV znacznie lepiej. Załóżmy jednak, że rozmiar tego pliku zmienia się na 1 GB podczas pisania na nim php.Więc ile pamięci zajmie, to znaczy, że nie spowoduje błędu pamięci? Kiedy otworzymy plik 1 GB w oprogramowaniu do notatnika, zobaczymy, że zostanie on powieszony, czy php jest zoptymalizowany, aby to zrobić? – techgyani

+1

PHP nie musi mieć wszystkich danych w pamięci w tym samym czasie, aby zapisać plik. Możesz mieć zapytanie o wyrocznię, zwracając jednocześnie 1000 danych dla wszystkich 100 użytkowników, nie tylko dla jednego użytkownika. Napisz 1000 wierszy na raz do pliku. Następnie zdobądź kolejne 1000 wierszy za pośrednictwem Oracle. Dodaj następne 1000 wierszy itp. (Możesz eksperymentować z liczbą wierszy, która działa najlepiej pod względem szybkości i zużycia pamięci). – DWright

+0

Dobra sugestia, ale jedną rzecz, o której zapominam, to to, że muszę używać wielu arkuszy w dokumencie Excel, takich jak dane HRV wszystkich użytkowników w pojedynczym arkuszu, a wskaźnik oddychania w innym arkuszu i mam tutaj serwery Linux. Więc konwersja CSV do XLS będzie działała lub muszę zastosować to samo podejście do plików XLS. – techgyani

1

Jeśli dane pojedynczego użytkownika są ogromne, zużywasz tyle pamięci, aby zachować te dane, spróbuj zapisać je w programie Excel w trybie wsadowym. Oszczędza to zużycie pamięci.

Powiązane problemy