【问题标题】:JULIA : How can l write and store files in a loop ?JULIA:如何循环写入和存储文件?
【发布时间】:2016-10-27 00:59:44
【问题描述】:

我有一个庞大的数据集,它被分成 k 个迷你数据集,其中 k=100。知道我想将这些迷你数据集存储在不同的文件中。 为了存储我的海量数据集,我使用了以下说明:

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)

知道 l 将我的数据集划分为 k 个子数据集,其中 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

但此功能允许将不同的子数据集存储在一个文件中,该文件在每次迭代时都会被覆盖。

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")

或者我尝试了这个程序 函数get_mini_batch(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

但我不知道如何在这一行代码中创建变量 i=1....100 file[i]= jldopen("/path to my file/mydata(i) .jld", "w")

【问题讨论】:

    标签: makefile julia


    【解决方案1】:

    您正在寻找string formatting

    要创建文件名,您可以使用@sprintf()。然后您可以使用这些字符串将您的对象写入磁盘。

    julia> using Printf  # Needed in Julia 1.0.0
    julia> @sprintf("myfilename%02.d.jld", 5)
    "myfilename05.jld"
    

    循环示例:

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

    我在这里使用了%03.d 来展示如何在文件名中添加前导零。这将在以后进行排序时有所帮助。

    【讨论】:

    • 但是我怎么能打开一个文件,在里面写入并使用@sprintf() 存储它呢? like : file = jldopen("path to my file/mydata.jld", "w") # 文件的扩展名是 jld 所以你应该添加包 JLD 和 HDF5, Pkg.add("JLD"), Pkg.add( "HDF5"), write(file, "X", X) # 或者说 "@write file A"
    • 您可以使用@spritnf 指定文件名。例如,在您的问题中,第二个代码块替换:file= jldopen("/path to my file/mydata.jld", "w")file= jldopen(@sprintf("/path to file/mydata%d.jld, i), "w") 其中i 是您循环的小批量数量。
    • 我的问题与“stackoverflow.com/questions/37989159/…”这个话题有关。我想创建文件来存储 X[P] 值。我应该如何着手解决这个问题?
    【解决方案2】:

    我同意 niczky12 的观点,即您正在寻找字符串格式。但我个人会用另一种方式写它:

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

    而不是使用sprintf

    例子:

    julia> i = 4
    4
    
    julia> "/path/mydata$i.jld"
    "/path/mydata4.jld"
    

    【讨论】:

    • 是的,这是最简单的方法。在这种情况下,我只是更喜欢使用前导零,因此我使用了@sprintf。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-09
    • 1970-01-01
    • 2018-01-12
    • 1970-01-01
    • 2020-03-25
    • 1970-01-01
    • 2018-03-31
    相关资源
    最近更新 更多