2016-08-04 47 views
0

Dies ist ein Parser, der einige HTML-Seiten gemma und kratzen sie, aber es essen eine Menge Speicher nicht Müll gesammelt werden.Ruby Speicher leckt

Diese übergeben das Ergebnis an ein Formular. Hier passiert die Speichernutzung.

Gibt es eine offensichtliche Speicherlecks in diesem Code?

+0

Je nach dem Wert von 'item_selector' behalten Sie möglicherweise die gesamte Struktur in' @ items' und geben sie an den übergeordneten Bereich zurück. – Owen

+1

Side Note: '@items = @ items.map' erstellt ein neues Objekt und behält das alte im Speicher. '@ items.map!' wird dasselbe Objekt an Ort und Stelle bearbeiten (kein neues Objekt, keine Kopie). – Myst

+0

Bitte lesen Sie "[mcve]". Wir können Ihren Code nicht ausführen, weil Teile fehlen und Sie nicht wissen, wie groß eine Datei ist, die Sie analysieren, aber im Allgemeinen sind Speicherlecks kein Problem mit Nokogiri oder Ruby. Sie scheinen beim Analysieren mehrere Seiten zu ziehen, aber ohne die minimalen Eingabedatenbeispiele können wir nicht sagen, was wirklich vor sich geht. –

Antwort

0

Das Problem lag an Puma + Ruby> = 2.1.x. Downgrade auf Ruby '2.0.0' wurde korrigiert.

Es ist nicht klar, ob es ein Speicher leckt Fehler oder ein Speicher aufgebläht. Wie auch immer, diese Kombination ist Memory prohibitiv.

2-Wege sind:

  • Nicht verwenden Puma (WEBrick oder Einhorn hat dieses Problem nicht mit Ruby-2.3.1)
  • Herunterstufung Ruby 2.0.0

https://github.com/puma/puma/issues/342

+0

BTW, nichts mit Nokogiri, Imagemagic, Nebel-Edelsteinen, außer dass mein Code speicherintensiv ist und viele Seiten gleichzeitig abruft. –

+1

Sie aggregieren Daten von Seiten im Speicher. Wenn Sie nur ein paar Seiten machen, wäre das eine Sache, aber wenn Sie eine Website oder mehrere Websites erstellen, ist es nicht intelligent. Verwenden Sie eine Backing-Datenbank, um die Informationen, die Sie erfassen, anstelle von "Sammlung" zu speichern. Sogar eine SQLite-DB auf der Festplatte wäre dazu in der Lage. Das Sequel ORM macht es wirklich einfach damit zu arbeiten. Siehe http://sequel.jeremyevans.net/rdoc/files/README_rdoc.html#label-Getting+Started. Puma und Unicorn sind Server, also sind sie nicht mit dem Problem verbunden, noch ist die Ruby-Version das Problem. –

+0

@theTinMan Danke. Du hast recht. Dieser Anwendungsfall benötigt jedoch einen Webserver, also ist dies das Problem, nicht Nokogiri, noch Parser-Prozess überhaupt. Es ist ein Bug (oder ein Problem), der eine Webanwendung anzeigt. Ich dachte, dass es mit Kratzen zu tun hat, aber das ist nicht der Fall. –