Seite 1 von 1

Archetypen Analyse Speicherproblem

Verfasst: Mi Mai 16, 2018 6:35 pm
von Joe_Gerner
Hallo,

ich arbeite momentan dem dem Package Archetypes und verwende 3D Gebäudedatensatz Datensatzes mit ca. 12 Mio. Objekten, wobei jedes Objekt ungefähr 6 verschiedene Merkmale besitzt. Diesen Datensatz möchte ich jetzt mit dem Package Archetypes bearbeiten, speziell mit der Steparchetypes Funktion.

Hier der Code zur Funktion:
function (..., k, nrep = 3, method = archetypes, verbose = TRUE)
{
mycall <- match.call()
as <- list()
for (i in 1:length(k)) {
as[] <- list()
class(as[]) <- "repArchetypes"
for (j in seq_len(nrep)) {
if (verbose)
cat("\n*** k=", k, ", rep=", j, ":\n", sep = "")
as[][[j]] <- method(..., k = k)
}
}
return(structure(as, class = "stepArchetypes", call = mycall))
}



Momentan habe stehe ich jedoch vor dem Problem, dass mir ab einer gewissen Anzahl an Durchläufen der Funktion der Arbeitsspeicher komplett voll läuft und die Berechnung abbricht und mir diesen Fehler auswirft:
Error: cannot allocate vector of size 14.4 Mb
In addition: There were 12 warnings (use warnings() to see them)


Dies geschiet auch bei einem Rechner mit 64 GB RAM. Meinen Datensatz habe ich bereits so weit wie möglich ausgedünnt und lade nur noch die,für die Berechnung wichtigen Merkmale, in R-Studio. Die GarbageCollector gc() Funktion von R-Studio kann den Arbeitsspeicher auch nicht wieder frei geben. Einzig ein kompletter Neustart von R-Studio kann den Arbeitsspeicher wieder freigeben, was während der Ausführung der Funktion nicht möglich ist.

Kann mir bitte Jemand weiterhelfen und hat eine Idee wie ich dieses Problem umgehe?

Vielen Dank und viele Grüße

Re: Archetypen Analyse Speicherproblem

Verfasst: Mi Mai 16, 2018 8:51 pm
von EDi
ca. 12 Mio. Objekten, wobei jedes Objekt ungefähr 6 verschiedene Merkmale
D.h. dein Datensatz hat schonmal > 12Mio*6*8bytes ~0.5GB ...

Innerhalb der Funktion wird das k * nrep kopiert und dann ist immernoch die Frage was archetypes damit anstellt...
Kurz 64Gb ist nicht viel für das was du machen willst...

Entweder mehr RAM kaufen/mieten oder vielleicht in chunks den Datensatz durcharbeiten (falls das Sinn ergibt). k und nrep runtersetzen bringt auch was (falls das Sinn ergibt).

Re: Archetypen Analyse Speicherproblem

Verfasst: Do Mai 17, 2018 4:32 pm
von Joe_Gerner
Vielen Dank für die schnelle Antwort.
k und nrep kann ich leider nicht runtersetzen. Das eigentliche Ziel ist es diese sogar noch zu erhöhen, um die optimale Anzahl von Archetypen heraus finden zu können.

Ich habe als möglichen Lösungansatz mal versucht die Funktion umzustellen, um das Ganze mithilfe von Python aufzurufen. Also die Idee dahinter ist, dass ich das R-Script mithilfe von Python aufrufe, einen Schleifendurchlauf ausführen lasse, das Ganze zwischenspeichere, die R-Session neustarte und dann die gespeicherten Zwischenergebnisse der Funktion wieder übergebe und den nächsten Schleifendurchlauf ausführen lasse.
Das Ganze in der Hoffnung, damit das Speicherproblem zu umgehen, denn ein Neustart der R-Session gibt den belegten Arbeitsspeicher komplett wieder frei. Nur leider bin ich in Python nicht ganz so fit, deswegen hier nochmal mein bisheriges Skript:
R-Skript:
setwd("C:/Users/R_Berechnungen")
test <- read.csv2("C:/Users/R_Berechnungen/düsseldorf.csv")

dd <- test[24:30]
dd <-na.omit(dd)

set.seed(1234)
steparchetyp <- function (..., k, verbose = TRUE)
{ i <- 1
nrep=3
as <- list()
as[] <- list()
args = commandArgs(trailingOnly=TRUE)
for (j in seq_len(nrep))
{
mycall <- match.call()
if (verbose)
class(as[]) <- "repArchetypes"
cat("\n*** k=", k, ", rep=", j, ":\n", sep = "")
method = archetypes
as[][[j]] <- method(..., k = k)
}

return(structure(as, class = "stepArchetypes", call = mycall))
}

Python Skript:

from subprocess import Popen

r_exe = r'C:/Program Files/R/R-3.4.4/bin/Rscript'
r_script = r'C:/Users/R_Berechnungen/Python/myScript_3.R'
for p_i in range(0,4):

subprocess.call([r_exe,r_script,str(p_i)])

________________________________________________________________________________________________________
Mir fehlt momentan noch die Idee wie ich die in Python festgelegte Anzahl an Schleifendurchläufen an R übergebe und dort genau einen Schleifendurchlauf starte, das Ganze speichere und dann beim nächsten Aufruf wieder an den neuen Durchlauf übergebe.

Ich hoffe das mein Ansatz überhaupt Sinn ergibt und das mir vielleicht Jemand von euch helfen kann.

Vielen Dank und viele Grüße

Re: Archetypen Analyse Speicherproblem

Verfasst: Do Mai 17, 2018 8:25 pm
von EDi
Wozu python hier?
Du kannst das Zwischenspeichern (auf die Platte) direkt in R machen. Oder via Rscript in bash.

Re: Archetypen Analyse Speicherproblem

Verfasst: Sa Mai 19, 2018 6:36 pm
von Joe_Gerner
Hallo,

jetzt mal ganz blöd gefragt, wie würde das in meinem konkreten Fall aussehen? Es tut mir Leid falls die Frage etwas zu einfach ist, aber ich weiß nicht so recht wie ich das Ganze in R umsetzen soll.

Also ich würde die Funktion jetzt folgendermaßen ausführen

stepar <- function (..., k, verbose = TRUE)
{ i <- 1
nrep=3
as <- list()
as[] <- list()
args = commandArgs(trailingOnly=TRUE)
for (j in seq_len(nrep))
{
mycall <- match.call()
if (verbose)
class(as[]) <- "repArchetypes"
cat("\n*** k=", k, ", rep=", j, ":\n", sep = "")
method = archetypes
as[][[j]] <- method(..., k = k)
}

return(structure(as, class = "stepArchetypes", call = mycall))
}


aa1 <- stepar(dd_neu, k = 1)
saveRDS(aa1,"C:/Users/R_Berechnungen/Output/aa1.rds")

___________________________________________________________________________________________________________

Wie übergebe ich jetzt einem zweiten Schleifendurchlauf die Ergebnisse vom ersten Durchlauf und sage ihm das er bei k = 2 ansetzen soll?
Und wie gesagt sorry für die vielleicht zu einfache Frage, aber ich steh momentan total auf dem Schlauch

Vielen Dank und viele Grüße

Re: Archetypen Analyse Speicherproblem

Verfasst: Sa Mai 19, 2018 10:05 pm
von consuli
EDi hat geschrieben: Do Mai 17, 2018 8:25 pm Du kannst das Zwischenspeichern (auf die Platte) direkt in R machen. Oder via Rscript in bash.
Du könntest Dir auch ein Samsung NVMe SSD kaufen und es mit dem Paket bigmemory RAM-like benutzen.


Aber eigentlich glaube ich eher, Du hast einen speicherfressenden Fehler in Deinem Code.
Joe_Gerner hat geschrieben: Mi Mai 16, 2018 6:35 pm Dies geschiet auch bei einem Rechner mit 64 GB RAM. Meinen Datensatz habe ich bereits so weit wie möglich ausgedünnt und lade nur noch die, für die Berechnung wichtigen Merkmale, in R-Studio. Die GarbageCollector gc() Funktion von R-Studio kann den Arbeitsspeicher auch nicht wieder frei geben.
Um diesem möglichen Problem nachzugehen, würde ich den Code testweise zuerst mit einem minimalen Datensatz aus nur 3 bis 5 Zeilen laufen lassen.

Consuli