2016-04-30 10 views
2

Kompilieren ein RMarkdown Skript über Nacht mit der Nachricht fehlgeschlagen:R Code fehlgeschlagen mit: „Fehler: kann Puffer nicht zuordnen“

Error: cannot allocate buffer
Execution halted

Der Code Brocken, die es auf gestorben war, während eine caretEnsemble Liste von 10 Algorithmen des maschinellen Lernens Ausbildung . Ich weiß, dass es ein bisschen RAM und Rechenzeit braucht, aber ich habe es vorher geschafft, den gleichen Code in der Konsole auszuführen. Warum ist es in RMarkdown fehlgeschlagen? Ich bin mir ziemlich sicher, dass es genug Swap gab, selbst wenn es keinen freien RAM mehr gab.

Ich benutze Ubuntu mit 3GB RAM und 4GB Swap.

Ich fand in R einen Blog-Artikel über Speichergrenzen, aber es gilt nur für Windows: http://www.r-bloggers.com/memory-limit-management-in-r/

Irgendwelche Ideen auf die Lösung/dieses Problem zu vermeiden?

+2

Sie können versuchen, diesen Teil des Codes zu beziehen (dh stecken Sie ihn in ein anderes Rscript). Nicht sicher, dass es funktioniert, aber einen Versuch wert. Wenn dies nicht funktioniert, können Sie es immer separat ausführen, speichern Sie die Ergebnisse mit 'save' und laden Sie sie dann für Ihre schreiben. – lmo

+0

Danke, am Ende habe ich 'saveRDS' benutzt. Nicht die eleganteste, da es nicht überprüft, ob die zwischengespeicherten Daten aktualisiert werden müssen, aber es funktioniert für jetzt. In Zukunft muss ich herausfinden, wie man Caching/Memoization besser nutzt. – adatum

Antwort

2

Ein Grund, warum es Backups sein kann, ist, dass knitr und Rmarkdown nur eine Schicht von Computerkomplexität zu den Dingen hinzufügen und sie etwas Speicher benötigen. Die Konsole ist die effizienteste Implementierung.

Auch Caret ist fett, langsam und uneinsichtig. Wenn der maschinelle Lernalgorithmus komplex ist, der Datensatz groß ist und Sie über begrenzten Arbeitsspeicher verfügen, kann dies problematisch werden.

Einige Dinge, die Sie um die Belastung zu reduzieren tun können:

  1. Wenn es nicht verwendete Variablen im Set sind, eine Teilmenge von denen, verwenden Sie wollen und dann den alten Satz aus dem Speicher löscht mit rm() mit Ihrem Variablenname für den Datenrahmen in den Klammern.

  2. Nachdem Sie Variablen entfernt haben, führen Sie garbage collect aus, es ruft den Speicherplatz ab, den Ihre entfernten Variablen und vorläufigen Sätze im Speicher belegen.

R keine nativen mittels Speicherspülung hat, so dass, wenn eine Funktion nicht mit einem Müll sammeln geschrieben und Sie tun es nicht, alle Ihre Vergangenheit ausgeführt verweigern wird im Speicher persistierenden das Leben schwer zu machen.

Geben Sie dazu gc() mit nichts in den Klammern ein. Löschen Sie auch den Speicher mit gc() zwischen den 10 ML-Läufen. Und wenn Sie Daten mit XLConnect importieren, ist die Java-Implementierung scheußlich ineffizient ... das allein könnte Ihren Speicher, gc(), nach der Verwendung jedes Mal tippen.

  1. Nach dem Einrichten Ausbildung, Prüfung und Validierung setzt, die Prüfung und Validierung von Dateien im CSV-Format auf der Festplatte speichern und entfernen Sie sich von Ihrem Speicher und läuft, Sie ahnen es gc(). Laden Sie sie erneut, wenn Sie sie nach dem ersten Modell benötigen.

  2. Sobald Sie, welche der Algorithmen entschieden zu laufen, versuchen, ihre ursprünglichen Pakete separat statt laufen Caret Installation require() jeden namentlich , wie Sie nach jedem mit detach(package:packagenamehere)gc() es und aufzuräumen bekommen.

Dafür gibt es zwei Gründe.

Ein, Caret ist eine Sammlung von anderen ML-Algorithmen, und es ist inhärent langsamer als alle von ihnen in ihrer nativen Umgebung. Ein Beispiel: Ich habe einen Datensatz durch Zufallswald in Caret ausgeführt, nach 30 Minuten war ich weniger als 20% fertig. Es war bereits nach etwa einer Stunde zweimal abgestürzt. Ich habe das ursprüngliche unabhängige Paket geladen und in ca. 4 Minuten eine vollständige Analyse durchgeführt.

Zwei, wenn Sie benötigen, trennen und Müll sammeln, haben Sie weniger in resident Speicher, um sich Sorgen zu machen Sie niederzulegen. Sonst haben Sie alle Caret-Funktionen gleichzeitig im Speicher ... das ist verschwenderisch.

Es gibt einige allgemeine Dinge, die Sie tun können, um es besser zu machen, die Sie vielleicht zunächst nicht denken, aber nützlich sein könnten. Abhängig von deinem Code können sie unterschiedlich arbeiten oder arbeiten, aber probiere sie aus und sieh wo sie dich hinbringt.

I. Verwenden Sie das lexikalische Scoping zu Ihrem Vorteil. Führen Sie das gesamte Skript in einer sauberen Rstudio-Umgebung aus und stellen Sie sicher, dass alle Teile und Teile in Ihrem Arbeitsbereich vorhanden sind. Dann sammeln Müll die Überreste. Dann gehen Sie zu knitr & rMarkdown und rufen Sie Stücke und Teile von Ihrem vorhandenen Arbeitsplatz. Sie steht Ihnen in Markdown unter der gleichen rStudio-Shell zur Verfügung, solange nichts in einer Schleife erstellt wurde und nicht in einer globalen Umgebung gespeichert wurde.

II. Beim Abzählen setzen Sie Ihre Code-Chunks so hoch, dass Sie die Sachen zwischenspeichern, die mehrfach berechnet werden müssten, so dass sie irgendwo bereitstehen, um angerufen zu werden, anstatt den Speicher mehrfach zu besteuern.

Wenn Sie eine Variable aus einem Datenrahmen aufrufen, tun Sie etwas so einfach wie Multiplizieren gegen es zu jeder Beobachtung in einer Spalte und speichern Sie es wieder in diesem ursprünglichen Rahmen, könnten Sie mit bis zu 3 Kopien im Speicher landen . Wenn die Datei groß ist, ist das ein Mörder. Also eine saubere Kopie machen, Müll sammeln und den reinen Rahmen zwischenspeichern.

Caching scheint intuitiv wie es Speicher verschwenden würde, und falsch gemacht, es wird, aber wenn Sie rm(), um die unnötige aus der Umwelt und gc() regelmäßig, werden Sie wahrscheinlich aus taktischem Caching

III profitieren. Wenn sich die Situation noch immer verschlechtert, können Sie versuchen, Ergebnisse in CSV-Dateien zu speichern, sie auf die Festplatte zu senden und sie bei Bedarf zurückzurufen, um sie aus dem Speicher zu entfernen, wenn Sie nicht alle Daten gleichzeitig benötigen.

Ich bin ziemlich sicher, dass Sie das Programm zum Laden und Entladen von Bibliotheken, Daten und Ergebnissen nach Bedarf einstellen können. Aber ehrlich gesagt ist das Beste, was Sie tun können, basierend auf meiner eigenen voreingenommenen Erfahrung, weg von Caret bei großen Multialgorithmus-Prozessen.

0

Ich habe diesen Fehler erhalten, als ich versehentlich die 32-Bit-Version von R auf meinem 64-Bit-Rechner ausgeführt habe.

Verwandte Themen