Archetypen Analyse Speicherproblem

Wie erweitere ich R um eigene Funktionen oder Pakete? Welches Paket ist passend für meine Fragestellung?

Moderatoren: EDi, jogo

Antworten
Joe_Gerner
Beiträge: 3
Registriert: Mi Mai 16, 2018 10:42 am

Archetypen Analyse Speicherproblem

Beitrag von Joe_Gerner » Mi Mai 16, 2018 6:35 pm

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

Benutzeravatar
EDi
Beiträge: 551
Registriert: Sa Okt 08, 2016 3:39 pm

Re: Archetypen Analyse Speicherproblem

Beitrag von EDi » Mi Mai 16, 2018 8:51 pm

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).
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.

Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
Bild.

Joe_Gerner
Beiträge: 3
Registriert: Mi Mai 16, 2018 10:42 am

Re: Archetypen Analyse Speicherproblem

Beitrag von Joe_Gerner » Do Mai 17, 2018 4:32 pm

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

Benutzeravatar
EDi
Beiträge: 551
Registriert: Sa Okt 08, 2016 3:39 pm

Re: Archetypen Analyse Speicherproblem

Beitrag von EDi » Do Mai 17, 2018 8:25 pm

Wozu python hier?
Du kannst das Zwischenspeichern (auf die Platte) direkt in R machen. Oder via Rscript in bash.
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.

Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
Bild.

Joe_Gerner
Beiträge: 3
Registriert: Mi Mai 16, 2018 10:42 am

Re: Archetypen Analyse Speicherproblem

Beitrag von Joe_Gerner » Sa Mai 19, 2018 6:36 pm

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

consuli
Beiträge: 280
Registriert: Mo Okt 10, 2016 8:18 pm

Re: Archetypen Analyse Speicherproblem

Beitrag von consuli » Sa Mai 19, 2018 10:05 pm

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
Thanks to Steven for bringing up the best explanation for the existence and the origin of the universe, though. Especially for been a lighthouse of will-power still shining on, not only for disabled people, but any (beautiful minded) person.

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste