Array statisch hinterlegen

Technipion

Erfahrenes Mitglied
Hey Leute,
bin eigentlich eher der C/C++ Mensch, aber für ein kleines Projekt müsste ich eines meiner Skripte auf die PHP-Platform konvertieren.

Das eigentliche Programm ist unwichtig, ich hänge nur an einer bestimmten Stelle:
Ich habe eine Datei ala berechne.php die eine längere Operation mit einem Eingangswert durchführt. Dafür benötigt sie ein relativ großes Array von 4 - 6 MB. Um es kurz zu sagen: Es sind alle Primzahlen von 2 bis zu einer großen Obergrenze enthalten. Es wäre natürlich Quatsch das Array bei jedem Aufruf explizit neu auszurechnen, das würde enorm Zeit in Anspruch nehmen.
Deswegen möchte ich das Array puffern. Bei meinem ursprünglichen C++ - Programm ging das einfach im Arbeitsspeicher der Maschine, dort kann man das Array mit static über den gesamten Prozess hinweg verwenden. Bei PHP fällt mir auf Anhieb nur eine Pufferung durch eine Datei ein, aber dann müsste man jedes Mal die 4 - 6 MB einlesen...
Ich habe in meinem Buch nachgeschlagen, es gibt auch static in PHP, allerdings scheint das nicht das zu sein was ich brauche...?

Ich möchte das Array ein Mal berechnen und dann im Arbeitsspeicher des Servers ablegen, sodass es bei jedem Aufruf von berechne.php sofort verfügbar ist.
Wie mache ich das? Gibt es da Methoden für?
Hinweis: In der späteren Laufzeitumgebung gibt es kein! MySQL oder dergleichen. Nur reines PHP...

Danke schonmal im Voraus
Gruß Technipion
 
Session.

Das Problem ist nur, wenn viele User gleichzeitig zugreifen, dann hast du pro User die 4-6MB im Speicher.
 
Hi,

auf die Schnelle würde ich dir zu einem tmpfs / ramdisk raten. Darauf kannst du die Daten als Datei speichern und danach wieder auslesen, quasi fast wie im Arbeitsspeicher ablegen. Performance technisch wird das zwar nicht an deine C Version rankommen, aber der Overhead mit 4-6 MB / User / Session (wird ja auch auf der HDD gespeichert) wird somit verringert.

Grüße,
BK
 
Sessions zu nutzen ist keine gute Idee. Sie werden für jeden Nutzer einzeln angelegt, dabei sind doch deine Daten nutzerübergreifend.

Darfst du eine PHP-Erweiterung nutzen? Beispielsweise memcached oder APC?
 
Hey Leute,
danke für die Antworten! Ich konnte mich jetzt über die Feiertage durch memcached und APC durcharbeiten, leider werden jedoch die Erweiterungen vom Hoster nicht unterstützt...
Die Idee mit der Ramdisk hat mir gefallen, deshalb habe ich den Admin gefragt ob er das einrichten könnte; die Antwort war natürlich: Nein.
Er hat mir jedoch verraten dass die Server unter Ubuntu Server laufen, deshalb lege ich die Datei in /dev/shm an, das ist eine vorgefertigte Ramdisk. Die Laufzeit ist akzeptabel, und falls irgendwann noch andere Applikationen auf dieselbe Datenbank zugreifen müssen können sie die gleiche Datei nutzen (shm = shared memory -> prozessübergreifend).

Danke nochmal für eure Antworten!

Grüße Technipion
 
Hi,

bei dem shm wäre ich grundsätzlich vorsichtig, hier solltest du keine sensiblen Daten ablegen da prinzipell jedes Programm darauf zugreifen kann. Wenn du einen VServer hast, dann können auch andere Kunden da rein.

Grüße,
Simon
 
Hey,
danke für den Hinweis!
In diesem speziellen Fall dürfte das aber kein Problem sein, was sollen denn andere Programme großartig mit einem Array von Primzahlen anfangen?!
Habe es vorhin auch getestet, die Laufzeit liegt noch im Rahmen...

Ein Freund und ich, wir werden einfach noch etwas am Algorithmus schrauben, vielleicht bekommen wir es sogar hin dass man gar nichts mehr puffern muss.
Danke für eure Hilfe!

Gruß Technipion
 
Ich würde mal benchmarken, ob /dev/shm da wirklich einen spürbaren Vorteil bringt gegenüber dem normalen Dateisystem.



Um fürs Protokoll zumindest mal ’ne Hausnummer zu nennen:

Auf meinem System dauert es (ohne /dev/shm) ~15 ms, eine ~7-MB-Datei mit einem serialisierten Array einzulesen (file_get_contents), und dann noch mal ~180 ms, die Daten zu deserialisieren (unserialize).

Das mit /dev/shm bringt wahrscheinlich quasi überhaupt nichts. Ich würde davon abraten.

(Wenn eine Datei häufig eingelesen wird, kommt auch das Betriebssystem in der Regel von allein auf die Idee, die etwas günstiger zu organisieren.)
 
Zuletzt bearbeitet:
Zurück