Situation:
Ich hatte einen echt großen Array, den ich serialisiert gespeichert und gelesen habe.
Zuletzt war er ~48 MB groß. Beim Speichern beschwerte sich PHP wegen der Überschreitung des Speicherlimits von 128MB - und zwar genau in der Zeile, wo
file_put_contents( $file, serialize( $BigArray) );
drin stand. Der übrige Speicherverbrauch (außer dem Array) ist vernachlässigbar.
Das Problem mit dem aktuellen Skript habe ich mit einem Technologiewechsel gelöst (↦ squlite3). Und bin zufrieden.
Frage in die Runde:
$BigArray = unserialize( file_get_contents( $file ) );
war sehr schnell.
Gibt es womöglich eine speichersparende Methode um solche Datenmengen für Systeme ohne Voraussetzungen (wie z.B. eine Datenbank) wegschreiben zu können?
Hinweise:
unserialize()
hat dieses speicherfressende Verhalten nicht, die auf einem System mit 256MB Limit erzeugte Datei konnte ich problemlos (und sehr schnell!) einlesen.json_encode()
meine ich nicht, weiljson_decode()
bei solchen Datenmengen spürbar langsamer wird.- Die Alternative sollte also serialisierte Daten erzeugen, die ich mit
unserialize()
einlesen kann. - Wenn das serialisieren mit der alternativen Methode länger dauert, dann ist das kein Problem.