Ich habe ein Speicherproblem mit PHPExcel beim Verarbeiten einer XLS-Datei. Ich muss mit ziemlich großen Dateien arbeiten (zwischen 50k und 200k Zeilen und 9-10 Spalten), also musste ich ReadFilters verwenden, um das Speicherproblem zu lösen.
Obwohl es mit XLSX-Dateien ziemlich gut funktioniert hat, habe ich eine Mischung aus Hintergrundprozessen und einigen einfachen Berechnungen für die Chunk-Größe verwendet, aber es funktioniert nicht mit XLS-Dateien.
Dies ist das Stück Code, in dem alles explodiert:
%Vor%Unmittelbar danach fügte ich die folgenden Zeilen ein, um eine bessere Vorstellung von dem zu bekommen, was geschah:
%Vor%Und ich denke, dass es darauf hinweist, wo das Speicherproblem ist. Als ich die ursprüngliche XLS-Datei zum ersten Mal hochgeladen habe, hatte Excel-info.txt eine Größe von 13M. Dann öffnete ich die XLS-Datei und speicherte sie als XLSX, und wiederholte den Prozess, nach dem Excel-info.txt nur 285k war.
Gibt es eine Möglichkeit, diese Filter so zu modifizieren, dass sie mit XLS-Dateien funktionieren?
Oh, und das Setzen des PHP-Speicherlimits auf einen höheren Wert ist keine Option, aber die Ausführungszeit ist nicht kritisch.
HINZUGEFÜGT
Wenn ich verschiedene Speicher-Caching-Optionen verwendet habe, konnte ich die Speichernutzung so weit reduzieren, dass sie funktionierte, und sie in den meisten Fällen auf einer akzeptablen Größe gehalten.
Im Moment benutze ich PHPExcel_CachedObjectStorageFactory :: cache_to_sqlite, und es scheint genug zu sein, damit es funktioniert.
Ich möchte bemerken, dass die Berechnung, die ich über serialisierte Informationen in einer Datei vorgenommen habe, falsch war. Excel5-Dateien erzeugen ein Array mit so vielen Datensätzen wie Zeilen. Die Excel-Datei hat alle ihre Werte, die die auf NULL festgelegte Filterbedingung nicht erfüllen. Natürlich, wenn ich es in eine Textdatei speichern, etwas wie ...
haben %Vor%... nimmt viel Platz in der Datei ein, sollte aber nicht in php_memory liegen, das war also meine Schuld.
Jetzt verwende ich diesen Code, um die Speichernutzung zu verfolgen:
%Vor%Mit einer bestimmten XLS-Datei wird angezeigt:
1. Iteration 1- Verwendung: 4.3859634399414 2- Verwendung: 34.292671203613 3- Verwendung: 34.68034362793
2. Iteration 1- Verwendung: 34.68034362793 2- Verwendung: 34.68293762207 3- Verwendung: 34.684982299805
Und die selbe Datei, nach dem Speichern als XLSX:
1. Iteration 1- Verwendung: 4.2780990600586 2- Verwendung: 6.9042129516602 3- Verwendung: 7.2916641235352
2. Iteration 1- Verwendung: 7.2916641235352 2- Verwendung: 7.5115432739258 3- Verwendung: 7.2813568115234
Ich muss jedoch sagen, dass nach dem Speichern als XLSX die Größe um ungefähr die Hälfte reduziert ist, daher kann ich nicht sagen, ob es ein Fehler oder ein erwartetes Verhalten ist.
PHPExcel ist ein Gedächtnisschwein. Ich habe es für mehrere Clients verwendet und festgestellt, dass Sie mit der php-Speicherbegrenzungseinstellung experimentieren müssen, um den Sweetspot zu finden, wo die durchschnittliche Datei geladen werden kann, die der Client wahrscheinlich importiert. Ich musste bei einigen Projekten bis zu 8 GB verwenden. Natürlich tun Sie das in der Routine, die die xls-Datei lädt ini_set ('memory_limit', '16M'), nicht in der Datei php.ini.
Haben Sie versucht, setReadDataOnly (true)?
Ich denke, der Grund ist, dass xls-Dateien nicht nur CSV-Daten sind, sondern ein Sammelbecken für viele andere Informationen (wie Fonts und Makros). Wenn Sie die Datei laden, versucht PHPExcel, alle Teile in den Speicher zu laden, wodurch eine riesige Struktur entsteht.
Tags und Links php phpexcel phpexcelreader