Rolf B: Mehrere Fragen bezüglich mehrere Tests großer Datenmengen

Beitrag lesen

Hallo T-Rex,

ob Du ein Speicherleck hast oder nicht kann man ohne Codeanalyse kaum sagen. Da hilft ggf. eine stringentere Strukturierung deiner Daten, vernünftige Nutzung lokaler Daten, so dass Du nach Abschluss einer einzelnen Berechnung sicher sein kannst, dass alle Arbeitdaten abgeräumt werden.

Wenn Du tatsächlich hunderte von MB aktiv für die Berechnung brauchst, ist PHP möglicherweise die falsche Sprache. Oder Du musst eine 64-bit Version von PHP verwenden.

Ich verstehe das so, dass Du N Parameter. Jeder Parameter kann eine gewisse Zahl von Werten annehmen. Diese Zahlen multipliziert man miteinander und bekommt eine bestimmte Zahl von Szenarios. Bei 2 Parametern zu je 10 Werten sind es 100 Szenarios. Und du möchtest jedes Szenario s auf jeden Datensatz d anwenden. Du hast also eine Menge von Berechnungen $$R(s_i, d_j)$$, mit $$s_i$$ als eins deiner Szenarios und $$d_j$$ als einen deiner Datensätze.

Eine zu klärende Frage wäre nun, ob Du für die Berechnung von $$R(s_i, d_j)$$ auf ein $$R(s_p, d_q)$$ zurückgreifen musst, wobei p≠i oder q≠j sein sollte. Soll heißen: Eine Rechnung, die Du für ein anderes Szenario des gleichen Datensatzes angestellst, oder für das gleiche Szenario bei einem anderen Datensatz. Wenn das so ist, musst Du Dir überlegen, wie diese Abhängigkeiten sind und eine Strategie planen, wie Du möglichst wenige dieser abhängigen Rechnungen im Speicher halten musst.

Wenn es keine solche Abhängigkeit gibt und jede Rechnung isoliert für sich ausgeführt werden kann, musst Du deine Speichernutzung analysieren. Wo legst Du Daten ab, wie kannst Du sicherstellen, dass nach Abschluss einer Rechnung alle Arbeitsdaten wieder verschwinden, und dann: was machst Du mit dem gefundenen Ergebnis? Muss es für irgendwas im Speicher bleiben? Wenn nicht: raus damit, entweder in eine Datei oder in eine SQL Tabelle. In einer SQL Tabelle hättest Du den Vorteil, dass parallele Zugriffe machbar sind, d.h. Du könntest mehrere Rechenbots parallel laufen lassen und nachher stehen in der Tabelle alle Ergebnisse. Wenn Du das mit einer Datei machst, musst Du sicher ein, dass das Locking funktioniert. Oder jeder Bot schreibt in eine eigene Datei, und Du integrierst die Dateien am Ende.

Wenn Du tatsächlich ein memory leak hast und es nicht beseitigt bekommst (es könnte ja auch ein Bug in einer Library sein), hilft nur das Setzen von Checkpoints und ein gelegentlicher Restart. D.h. Du merkst Dir, bei welchem Szenario und welchem Datensatz Du warst, beendest das PHP Programm und sorgst durch ein Steuerscript dafür, dass es gleich wieder aufgerufen wird. Anhand des Checkpoints kann das PHP Programm dann an der richtigen Stelle wieder aufsetzen.

Das ist jetzt alles abstrakt und ohne Kenntnis dessen, was Du eigentlich tust, nicht konkreter abzuhandeln.

Rolf

--
sumpsi - posui - obstruxi