2016-06-24 12 views
2

Ich habe eine riesige Datenmenge, die ich in k Mini-Datensätze unterteilt, wobei k = 100. Wissen, ich möchte diese Mini-Datensätze in verschiedenen Dateien speichern. meine massive Datenmenge l speichern verwendet, um die folgenden Anweisungen:JULIA: Wie kann ich Dateien in einer Schleife schreiben und speichern?

using JLD, HDF5 
    X=rand(100000) 
    file = jldopen("path to my file/mydata.jld", "w") # the extension of file is jld so you should add packages JLD and HDF5, Pkg.add("JLD"), Pkg.add("HDF5"), 
    write(file, "X", X) # alternatively, say "@write file A" 
    close(file) 

wissen l meine Daten-Sets in k Unter-Datensatz aufgeteilt, wobei k = 100

function get_mini_batch(X) 

    mini_batches = round(Int, ceil(X/100)) 

      for i=1:mini_batches 
       mini_batch = X[((i-1)*100 + 1):min(i*100, end)] 
       file= jldopen("/path to my file/mydata.jld", "w") 
       write(file, "mini_batch", mini_batch) # alternatively, say "@write file mini_batch" 
       lose(file) 
      end 
end 

aber diese Funktion den verschiedenen Sub-Datensatz gespeichert werden kann in eine Datei, die bei jeder Iteration überschrieben wird.

file= jldopen("/path to my file/mydata1.jld", "w") # at each iteration l want to get files : mydata1, mydata2 ... mydata100 
file= jldopen("/path to my file/mydata2.jld", "w") 
file= jldopen("/path to my file/mydata3.jld", "w") 
file= jldopen("/path to my file/mydata4.jld", "w") 
. 
. 
. 
file= jldopen("/path to my file/mydata100.jld", "w") 

Alternativ versucht l dieses Verfahren Funktion get_mini_batch aus (X)

mini_batches = round(Int, ceil(X/100)) 

      for i=1:mini_batches 
       mini_batch[i] = X[((i-1)*100 + 1):min(i*100, end)] 
       file[i]= jldopen("/path to my file/mydata.jld", "w") 
       write(file, "mini_batch", mini_batch) # alternatively, say "@write file mini_batch" 
       lose(file) 
      end 
end 

aber ich nicht die Vorstellung davon, wie eine Variable machen i = 1 .... 100 innerhalb dieses Zeile Code-Datei [i] = jldopen ("/ Pfad zu meiner Datei/mydata (i) .jld", "w")

Antwort

4

Sie suchen string formatting suchen. Um die Dateinamen zu erstellen, können Sie @sprintf() verwenden. Dann können Sie diese Zeichenfolgen verwenden, um Ihre Objekte auf die Festplatte zu schreiben.

julia> @sprintf("myfilename%02.d.jld", 5) 
"myfilename05.jld" 

Beispiel in einer Schleife:

julia> for i in 1:3 
      println(@sprintf("myfilename%03.d.jl", i)) 
     end 
myfilename001.jl 
myfilename002.jl 
myfilename003.jl 

I verwendet %03.d hier zu zeigen, wie Sie führende Nullen, Dateinamen hinzufügen. Dies hilft später beim Sortieren.

+0

aber wie kann kann ich eine Datei öffnen, schreiben innen und speichern sie mit @sprintf()? like: file = jldopen ("Pfad zu meiner Datei/mydata.jld", "w") # Die Erweiterung der Datei ist jld, also sollten Sie die Pakete JLD und HDF5, Pkg.add ("JLD"), Pkg.add ("HDF5"), schreiben (Datei, "X", X) # alternativ "@write file A" sagen – vincet

+0

Sie können '@ spritnf' verwenden, um den Dateinamen anzugeben. Zum Beispiel in Ihrer Frage, ersetzen zweiten Code Block: 'file = jldopen ("/Pfad zu meiner Datei/mydata.jld "," w ")' mit 'file = jldopen (@sprintf ("/Pfad zu Datei/mydata% d.jld, i), "w") 'wo' i' die Nummer des Minibuches ist, über das du dich wiederholst – niczky12

+0

danke es ist klarer. Ich bin dankbar – vincet

1

Ich stimme mit niczky12 überein, dass Sie nach String-Formatierung suchen. Aber ich würde es diese alternative Art und Weise persönlich schreiben:

"/path to my file/mydata$i.jld" 

statt sprintf zu verwenden.

Beispiel:

julia> i = 4 
4 

julia> "/path/mydata$i.jld" 
"/path/mydata4.jld" 
+0

Ja, das ist der einfache Weg. Ich bevorzuge nur die führenden Nullen in diesem Fall, daher habe ich '@ sprintf' verwendet. :) – niczky12