Ich arbeite gerade an einigen persönlichen Tests und Benchmarks, um den Arbeitsablauf und die Effizienz zwischen der Verwendung von MongoDB und MySQL mit echten Beispieldaten zu vergleichen.
Um meine Daten in jeder Datenbank einzurichten, mache ich mehrere tausend Schleifen und erzeuge zufällig Datenobjekte, die in die Datenbank eingefügt werden.
Allerdings habe ich einige Probleme mit der Mongo-Klasse in PHP, die ich nicht lösen kann. Das Problem ist so:
Ich habe eine Schleife, die eine neue Mongo-Instanz und Verbindung erstellt, ein kleines Array in eine Sammlung einfügt und dann die Verbindung schließt. Diese Schleife sollte 20000 Mal ausgeführt werden. Allerdings scheitert es immer an der 16300. Schleife (mit einem Minimum von 16200 und Max von 16350, würde ich nach ein paar Läufen sagen), wenn es versucht, die Instanz zu erstellen / eine Verbindung herzustellen.
Der Code in der Schleife ist unten:
%Vor%get_random_user_data () gibt nur ein einfaches assoziatives Array zurück.
Der Fehler, den ich bekomme, ist:
%Vor%In der Zeile:
%Vor%Irgendwelche Ideen? Gibt es etwas Grundlegendes, das mir fehlt, wie Sicherheit oder Spam-Schutz?
Vielen Dank im Voraus.
Zusätzliche Informationen:
Das Skript stirbt bei ungefähr 114,9797 Sekunden. Es ist kein PHP-Speicher oder zeitbasiertes Problem, da alle Limits angehoben werden und ich meine MySQL-Benchmarks gestern ausgeführt habe und 120000 Zeilen (mit der gleichen Methode der offenen Verbindung, Einfügen, Verbindung schließen) über eine Stunde ohne Probleme eingefügt habe.
Ausführen von PHP Version 5.3.5
phpinfo Mongo-Info:
%Vor%Ihr Betriebssystem hat eine begrenzte Anzahl von Sockets, die es zu öffnen bereit ist. Wenn Sie einen Socket öffnen und ihn dann schließen, wird er vom Betriebssystem nicht sofort wieder in den "verfügbaren" Pool gestellt, es bleibt eine Weile im "Time Wait" -Zustand hängen, dass Nat in seiner Antwort .
Sie können die Anzahl der Sockel erhöhen, die Ihr Betriebssystem öffnen wird, siehe Ссылка ( jeder Socket ist eine offene "Datei").
Sie verwenden auch eine ziemlich alte Version des Treibers, die Sie vielleicht in Erwägung ziehen sollten, zu aktualisieren.
Ich bestätige, dass das gleiche Verhalten auch vom Ruby-Treiber herrührt. Ich replizierte ähnlichen Fall mit Ruby Mongo, der 20000 Datensätze durch Öffnen / Schließen Mongo-Instanz jedes Mal einfügt. Und es fällt weiterhin zwischen 14110 und 14200.
Dies ist die Fehlermeldung
%Vor%Dies ist die komplette Stapelverfolgung
%Vor%Auch wie @ Chrisisui sagte, ich habe auch keine Gedächtnisverluste.
Dies ist das Skript, das ich versucht habe
%Vor%Ihre Benchmark macht keinen Sinn. Halten Sie die Verbindung nicht offen / geschlossen. Sie sollten die dauerhafte Verbindung wiederverwenden, anstatt sie jedes Mal zu öffnen / schließen. Wenn Sie den Socket schnell öffnen und schließen, haben Sie zu viele Sockets im Time-Wait-Status, die immer noch Dateideskriptoren verwenden
Ich bestätige, dass das gleiche Verhalten auch vom Ruby-Treiber herrührt. Ich replizierte ähnlichen Fall mit Ruby Mongo, der 20000 Datensätze durch Öffnen / Schließen Mongo-Instanz jedes Mal einfügt. Und es fällt weiterhin zwischen 14110 und 14200.
Dies ist die Fehlermeldung
%Vor%Dies ist die komplette Stapelverfolgung
%Vor%Auch wie @ Chrisisui sagte, ich habe auch keine Gedächtnisverluste.
Dies ist das Skript, das ich versucht habe
%Vor%Ihr Betriebssystem hat eine begrenzte Anzahl von Sockets, die es zu öffnen bereit ist. Wenn Sie einen Socket öffnen und ihn dann schließen, wird er vom Betriebssystem nicht sofort wieder in den "verfügbaren" Pool gestellt, es bleibt eine Weile im "Time Wait" -Zustand hängen, dass Nat in seiner Antwort .
Sie können die Anzahl der Sockel erhöhen, die Ihr Betriebssystem öffnen wird, siehe Ссылка ( jeder Socket ist eine offene "Datei").
Sie verwenden auch eine ziemlich alte Version des Treibers, die Sie vielleicht in Erwägung ziehen sollten, zu aktualisieren.
Ich arbeite gerade an einigen persönlichen Tests und Benchmarks, um den Arbeitsablauf und die Effizienz zwischen der Verwendung von MongoDB und MySQL mit echten Beispieldaten zu vergleichen.
Um meine Daten in jeder Datenbank einzurichten, mache ich mehrere tausend Schleifen und erzeuge zufällig Datenobjekte, die in die Datenbank eingefügt werden.
Allerdings habe ich einige Probleme mit der Mongo-Klasse in PHP, die ich nicht lösen kann. Das Problem ist so:
Ich habe eine Schleife, die eine neue Mongo-Instanz und Verbindung erstellt, ein kleines Array in eine Sammlung einfügt und dann die Verbindung schließt. Diese Schleife sollte 20000 Mal ausgeführt werden. Allerdings scheitert es immer an der 16300. Schleife (mit einem Minimum von 16200 und Max von 16350, würde ich nach ein paar Läufen sagen), wenn es versucht, die Instanz zu erstellen / eine Verbindung herzustellen.
Der Code in der Schleife ist unten:
%Vor%get_random_user_data () gibt nur ein einfaches assoziatives Array zurück.
Der Fehler, den ich bekomme, ist:
%Vor%In der Zeile:
%Vor%Irgendwelche Ideen? Gibt es etwas Grundlegendes, das mir fehlt, wie Sicherheit oder Spam-Schutz?
Vielen Dank im Voraus.
Zusätzliche Informationen:
Das Skript stirbt bei ungefähr 114,9797 Sekunden. Es ist kein PHP-Speicher oder zeitbasiertes Problem, da alle Limits angehoben werden und ich meine MySQL-Benchmarks gestern ausgeführt habe und 120000 Zeilen (mit der gleichen Methode der offenen Verbindung, Einfügen, Verbindung schließen) über eine Stunde ohne Probleme eingefügt habe.
Ausführen von PHP Version 5.3.5
phpinfo Mongo-Info:
%Vor%