2016-05-19 2 views
0

ich Code unten bin mit Daten von mongodb zu holen -itterator_to_array() nicht Parsen 50k Zeilen

$collection = $this->db->xyz ; 
$res = $collection->find($where); 
$res = iterator_to_array($res,false); 
print_r($res);die; 

Ich bin in der Lage 10 000 Zeilen aus dem obigen Code zu erhalten. Aber wenn ich 50 000 Zeilen bekomme, wird nichts gedruckt. Ich erhalte keine Fehler.

Ich bin in der Lage zu sterben() vor Iterator_to_array, aber danach bekomme ich nichts. Ich denke also, das Problem liegt in der iterator_to_array-Methode. Was kann ich in diesem Fall tun?

+0

Können wir "print_r" als Ursache ausschließen? Probiere 'echo count ($ res);', um zu sehen, ob das gedruckt wird oder nicht. – trincot

+0

@trincot kann nicht einmal sterben ('123'); –

+0

@RyanVincent Wie kann ich sie in Chargen verarbeiten. Mit Limit und Skip-Methode oder gibt es andere Möglichkeiten? –

Antwort

0

Nehmen wir an, jede Zeile ist, sagen wir, 400 Bytes groß. Könnte mehr sein (wahrscheinlich ist), könnte weniger sein.

400 Byte x 50k rows = sind 20MB

Die Chancen, das ist mehr als die memory_limit Einstellung ermöglicht es, einen Fehler verursacht und das Skript zu töten.

Es gibt einen Grund, warum wir Generatoren haben. Sie ermöglichen die Verarbeitung von Daten einzeln, um solche Speicherprobleme zu vermeiden.

Sie können dieses Problem "umgehen", indem Sie das Speicherlimit deaktivieren, aber denken Sie daran, dass 400 Byte pro Zeile eine ziemlich niedrige Schätzung waren. Die tatsächliche Menge kann schnell Schneegestöber werden. Wenn jede Zeile 1k groß wäre, wären das 50MB für die ganze Sache. 2k => 100MB und so weiter. Sie werden sehr schnell riskieren, Speicher auf dem Server selbst auszulöschen, und das ist ... schlecht.

+0

Danke. Das ist informativ. Aber gibt es eine Möglichkeit, etwas in PHP selbst zu tun. –

+0

@AmanGupta Warum paginieren Sie nicht? Holen Sie das 'count (*)', dann brechen Sie es in Stapeln, wenn es einen bestimmten Schwellenwert überschreitet. – SparK

+0

Wie kann ich es in Chargen brechen .... gibt es eine direkte Methode, oder ich muss es mit Limit zu tun und zu überspringen –