如何将大循环中每次计算的数据优雅存下来?

大家好,目前我有一个问题困扰,看看大家能不能给点建议?

我的思路是

for i=1:200
    for j=1:50000
        ...生成数1...
        ...生成数2...
        ...生成数3...
        ...生成数4...
        ...生成数5...
        # 如何在这里把生成数1,2,3,4,5分别存下来?
    end
end

我有几种解决办法,不知道哪种比较好

  1. 每个数对应生成200个文件,然后将50000次循环内得到的数值直接输出到文件中
  2. 每个数对应生成200个文件,然后将50000次循环内得到的数值,先放在一个数组中,然后将数组输出到文件中
  3. 一共生成200个文件,然后将50000次循环内得到的数值,都放在csv文件中,这样相当于,一个csv文件中有50000行5列的数据

这是我目前采用的方法
我现在采用的方法是,提前设置了200个csv文件,然后在50000次循环中依次讲我计算出的5个数据输出到一个csv文件中,但是这样对相当于对一个csv文件读写50000次,内存可能吃不消,所以我希望找到一种能够尽量降低内存使用量的一种方法。

我担心的地方:
因为循环很大,每次都产生5个新的数值,这样直接放入数组或者文件中,会不会使得占用的内存很大,然后导致程序变慢甚至卡死?

不知道大家有没有什么好方法呀?

using JLD2 # 这个包要单独安装

@save “你的文件名.jld2” A B C

谢谢你的回复,但是考虑到以后对这些数据的处理工作,我现在采用的方法是使用自己熟悉的csv。不知道这种思路下有没有好的方法呢?
我提前设置了200个csv文件,然后在50000次循环中依次将我计算出的5个数据输出到一个csv文件中,但是这样对相当于对一个csv文件读写50000次,内存可能吃不消,所以我希望找到一种能够尽量降低内存使用量的一种方法。

數據大了csv不僅從讀取速度和內存上都是瓶頸。上面@Roger 提到的庫就是為了解決這樣的問題。建議你否定這個選擇之前看看文檔試一試

谢谢~~~~
现在,按照上面的思路我写的程序已经可以运行了,速度适中,大概500秒左右。
下一步我准备按照您和Roger说的方法进行改进~~~~
谢谢~~~~

輸入輸出先不管,你估算一下所有數組加給來有多少?可以重複利用的空間有多少?如果內存夠大,就都放在內存里,在雙循環外面讀寫。文件讀寫不是內存問題而是速度問題。I/O和操作系統打交道都會很慢,最好不要放在循環裡面。

如果內存不夠再分批讀寫,共享部份內存。

怎么估计所有数组加起来有多少呢?以及怎么知道可以重复利用的空间有多少呀?利用@time中显示的占用内存吗?

不好意思,我不太懂这些…

julia> rand(1)
1-element Array{Float64,1}:
 0.722778

julia> sizeof(rand(1,1))
8

julia> sizeof(rand(200, 5000))
8000000

julia> sizeof(rand(200, 5000, 5))
40000000

单位是字节(B)。所以你的总共数据是40MB,小菜一碟。:grinning:

好的~懂了,谢谢,原来这么简单 :rofl: