Mit nur 4 GB RAM (unter Windows 10, also etwa 2 oder realistischerweise 1 GB) musste ich bei der Zuweisung sehr vorsichtig sein.
Ich verwende fast ausschließlich data.table.
Mit der Funktion "fread" können Sie die Informationen beim Import nach Feldnamen untergliedern; importieren Sie nur die Felder, die tatsächlich benötigt werden, und beginnen Sie damit. Wenn Sie base R read verwenden, löschen Sie die unerwünschten Spalten sofort nach dem Import.
Como 42- schlägt vor, dass ich, wo immer es möglich ist, unmittelbar nach dem Import der Informationen in den Spalten eine Unterteilung vornehme.
Ich lösche häufig Objekte aus der Umgebung, sobald sie nicht mehr benötigt werden, z. B. in der nächsten Zeile, nachdem ich sie für eine andere Untermenge verwendet habe, und rufe gc() auf.
'fread' und 'fwrite' aus data.table können sein sehr schnell im Vergleich zu Base R Lese- und Schreibvorgängen.
Como kpierce8 Ich schlage vor, dass ich fast immer alles aus der Umgebung herausschreibe und wieder einlese, selbst bei Tausenden oder Hunderttausenden winziger Dateien, die ich durchgehen muss. Dies hält nicht nur die Umgebung "sauber" und hält die Speicherzuweisung niedrig, aber, möglicherweise aufgrund der schweren Mangel an RAM zur Verfügung, R hat eine Neigung für häufig Abstürze auf meinem Computer; wirklich häufig. Da die Informationen auf dem Laufwerk selbst gesichert werden, während der Code die verschiedenen Phasen durchläuft, muss ich bei einem Absturz nicht wieder von vorne anfangen.
Ich glaube, dass die schnellsten SSDs im Jahr 2017 einige GB pro Sekunde über den M2-Anschluss laufen. Ich habe eine wirklich einfache 50 GB Kingston V300 (550 MB/s) SSD, die ich als meine primäre Festplatte (mit Windows und R darauf) verwende. Alle wichtigen Daten bewahre ich auf einer billigen 500-GB-Platte von WD auf. Ich verschiebe die Datensätze auf die SSD, wenn ich anfange, an ihnen zu arbeiten. Dies, kombiniert mit 'fread'ing und 'fwrite'ing, hat hervorragend funktioniert. Ich habe versucht, 'ff' zu verwenden, bevorzuge aber Ersteres. Die 4K-Lese-/Schreibgeschwindigkeiten können dabei allerdings zu Problemen führen; das Sichern einer Viertelmillion 1k-Dateien (250 MB) von der SSD auf die Platte kann Stunden dauern. Soweit mir bekannt ist, gibt es noch kein R-Paket, das den "Chunkification"-Prozess automatisch optimieren kann; z. B. kann es sich ansehen, wie viel RAM ein Benutzer hat, die Lese-/Schreibgeschwindigkeiten des RAM / aller angeschlossenen Laufwerke testen und dann ein optimales "Chunkification"-Protokoll vorschlagen. Dies könnte zu erheblichen Verbesserungen des Arbeitsablaufs bzw. zur Optimierung der Ressourcen führen, z. B. Aufteilung auf ... MB für den Arbeitsspeicher -> aufteilen auf ... MB für die SSD -> aufteilen in ... MB auf der Platte -> aufteilen auf ... MB auf dem Band. Es könnte vorher eine Stichprobe von Datensätzen machen, um eine realistischere Messlatte für die Arbeit zu haben.
Viele der Probleme, an denen ich in R gearbeitet habe, beinhalten die Bildung von Kombinations- und Permutationspaaren, Tripeln usw., was den begrenzten Arbeitsspeicher nur noch mehr einschränkt, da sie oft mindestens irgendwann exponentiell wachsen. Dies hat mich dazu veranlasst, mich intensiv mit der Qualität im Gegensatz zu Menge der Informationen, die zu Beginn in sie eingehen, anstatt zu versuchen, sie im Nachhinein zu bereinigen, und auf die Reihenfolge der Operationen bei der Aufbereitung der Informationen (beginnend mit der einfachsten Operation und mit zunehmender Komplexität); z. B. Untermenge, dann Zusammenführen/Verbinden, dann Kombinationen/Permutationen bilden usw.
Die Verwendung von Base R zum Lesen und Schreiben scheint in manchen Fällen einige Vorteile zu bieten. Zum Beispiel ist die Fehlererkennung in "fread" so gut, dass es schwierig sein kann, wirklich unordentliche Informationen in R zu bekommen, um sie zu bereinigen. Base R scheint auch viel einfacher zu sein, wenn man Linux benutzt. Base R scheint unter Linux gut zu funktionieren, Windows 10 benötigt ~20 GB Festplattenspeicher, während Ubuntu nur ein paar GB benötigt, der benötigte RAM ist bei Ubuntu etwas geringer. Aber ich habe eine große Anzahl von Warnungen und Fehlern bei der Installation von Paketen von Drittanbietern in (L)Ubuntu festgestellt. Ich würde nicht empfehlen, sich mit Linux zu weit von (L)Ubuntu oder anderen Standarddistributionen zu entfernen, da man so viel Kompatibilität verlieren kann, dass der Prozess fast sinnlos wird (ich glaube, "Unity" soll in Ubuntu ab 2017 abgeschafft werden). Mir ist klar, dass dies bei einigen Linux-Nutzern nicht gut ankommen wird, aber einige der benutzerdefinierten Distributionen sind grenzwertig sinnlos über die Neuheit hinaus (ich habe Jahre damit verbracht, Linux allein zu verwenden).
Ich hoffe, dass einige dieser Informationen anderen helfen können.
1 Stimmen
Wohlgemerkt, ich zweifle NICHT daran, aber was nützt das schon? Ich bin ziemlich neu bei Speicherproblemen in R, aber ich erlebe einige in letzter Zeit (das ist, warum ich für diesen Beitrag gesucht:) - so bin ich gerade erst anfangen mit all dies. Wie hilft mir das bei meiner täglichen Arbeit?
5 Stimmen
Wenn Sie die Objekte innerhalb einer Funktion sehen wollen, müssen Sie lsos(pos = environment()) verwenden, sonst werden nur globale Variablen angezeigt. Um in den Standardfehler zu schreiben: write.table(lsos(pos=environment()), stderr(), quote=FALSE, sep=' \t ')
0 Stimmen
Warum 64-Bit-Linux und nicht 64-Bit-Windows? Macht die Wahl des Betriebssystems einen nicht-trivialen Unterschied, wenn ich 32 GB Arbeitsspeicher zur Verfügung habe?
0 Stimmen
Ja, das funktioniert natürlich, und es wird auch unter Windows verwendet. Es gibt nichts Betriebssystem-spezifisches hier (oder in den meisten anderen R-Code).
0 Stimmen
@Jase: Der ursprüngliche Beitrag wurde zu einer Zeit geschrieben, als noch nicht viele Leute ein 64-Bit-Windows-Betriebssystem verwendeten (erinnern Sie sich, wie glücklich die Leute mit Vista waren?), und noch weniger von ihnen hatten ihre MB-Speichersteckplätze ausgeschöpft. Macs konnten zu dieser Zeit nur bis zu 32 GB aufnehmen.
0 Stimmen
Dies ist eine großartige Funktion. Aber wenn ich meinen Arbeitsbereich leeren möchte und dies mit "rm(list=ls())" tue, dann verliere ich diese Funktion. Gibt es eine Möglichkeit, zu verhindern, dass einige Dinge mit einem allgemeinen Befehl wie diesem gelöscht werden?
0 Stimmen
Ich kenne keinen erfahrenen R-Programmierer, der sich für eine
rm(list=ls())
. Aber Sie haben die Antwort schon parat: Schreiben Sie einen Filter, der diese (oder jede andere "heilige") Funktion aus der Liste entfernt, die anrm()
.3 Stimmen
@pepsimax: Dies wurde verpackt in der
multilevelPSA
Paket . Das Paket ist für etwas anderes gedacht, aber Sie können die Funktion von dort aus verwenden, ohne das Paket zu laden, indem Sie sagenrequireNamespace(multilevelPSA); multilevelPSA::lsos(...)
. Oder in derDmisc
Paket (nicht auf CRAN).0 Stimmen
Hallo Dirk, ich frage mich nur, warum hast du die
as.character()
umclass(x)
enobj.class <- napply(names, function(x) as.character(class(x))[1])
. Gibt es etwas, das ich nicht weiß, dachte ich.class(x)
gibt immer einen Zeichenvektor zurück0 Stimmen
Es ist ein fünfjährig SO Beitrag basierend auf einer elfjährig r-help E-Mail.
2 Stimmen
Wenn der Datensatz eine überschaubare Größe hat, gehe ich normalerweise zu R-Studio>Umgebung>Gitteransicht. Hier können Sie alle Elemente in Ihrer aktuellen Umgebung anhand der Größe sehen und sortieren.