2013-10-17 3 views
5

Angenommen, ich habe eine Matrix bigm. Ich brauche eine zufällige Teilmenge dieser Matrix und gebe sie einem maschinellen Lernalgorithmus wie zB svm. Die zufällige Teilmenge der Matrix wird nur zur Laufzeit bekannt sein. Zusätzlich gibt es weitere Parameter, die ebenfalls aus einem Raster ausgewählt werden.R: Erläuterung zur Speicherverwaltung

So habe ich Code, der etwa wie folgt aussieht:

foo = function (bigm, inTrain, moreParamsList) { 
    parsList = c(list(data=bigm[inTrain, ]), moreParamsList) 
    do.call(svm, parsList) 
} 

Was ich suche, zu wissen, ob R neue Speicher verwendet dieses bigm[inTrain, ] Objekt in parsList zu speichern. (Meine Vermutung ist, dass es tut.) Welche Befehle kann ich verwenden, um solche Hypothesen selbst zu testen? Gibt es außerdem eine Möglichkeit, eine Untermatrix in R zu verwenden, ohne neuen Speicher zu verwenden?

Edit:

Auch gehe ich davon aus foo mit mclapply nenne (unter Linux), wo bigm in den übergeordneten Prozess befindet. Bedeutet das, ich mache mc.cores Anzahl der Kopien von bigm oder alle Kerne verwenden Sie einfach das Objekt aus der Eltern?

Alle Funktionen und Heuristiken zum Verfolgen des Speicherorts und des Verbrauchs von Objekten in verschiedenen Kernen?

Danke.

Antwort

1

Ich werde einfach hier setzen, was ich aus meiner Forschung zu diesem Thema finden:

Ich glaube nicht, mit mclapplymc.cores Kopien von bigm auf diesem aus der Bedienungsanleitung für multicore basierten macht:

In a nutshell fork spawns a copy (child) of the current process, that can work in parallel 
to the master (parent) process. At the point of forking both processes share exactly the 
same state including the workspace, global options, loaded packages etc. Forking is 
relatively cheap in modern operating systems and no real copy of the used memory is 
created, instead both processes share the same memory and only modified parts are copied. 
This makes fork an ideal tool for parallel processing since there is no need to setup the 
parallel working environment, data and code is shared automatically from the start. 
1

Für Ihren ersten Teil der Frage, können Sie tracemem verwenden:

Mit dieser Funktion können ob markiert Ject, so dass eine Meldung ausgegeben wird, wenn die interne Code kopiert das Objekt

Hier ein Beispiel:

a <- 1:10 
tracemem(a) 
## [1] "<0x000000001669cf00" 
b <- a  ## b and a share memory (no message) 
d <- stats::rnorm(10) 
invisible(lm(d ~ a+log(b))) 
## tracemem[0x000000001669cf00 -> 0x000000001669e298] ## object a is copied twice 
## tracemem[0x000000001669cf00 -> 0x0000000016698a38] 
untracemem(a) 
+0

Dank für diese Antwort. Ich denke nur, dass es besser ist, zu erwähnen, dass dies nur verfügbar ist, wenn R 'mit --Enable-Memory-Profiling' kompiliert wurde. – asb

1

Sie bereits aus dem Handbuch herausgefunden, dass mclapply nicht auf Kopien von bigm soll. Aber jeder Thread muss eine eigene Kopie der kleineren Trainingsmatrix erstellen, da sie über die Threads variiert.

Wenn Sie mit z. snow benötigen Sie eine Kopie der Daten in jedem der Cluster-Knoten. In diesem Fall könnten Sie Ihr Problem so umschreiben, dass nur die kleineren Trainingsmatrizen übergeben werden.

Der Suchbegriff für die allgemeine Untersuchung des Speicherverbrauchsverhaltens ist Speicherprofilierung. Leider sind AFAIK die verfügbaren Werkzeuge (noch) nicht sehr komfortabel, siehe z.B.