2012-09-25 38 views
0

如何创建以下列表并将其保存到文件而不会导致内存不足?创建并保存一个非常大的数字列表

li = 1:2^40; 

我知道创建列表并将其写入文件块的明显解决方案。我想知道是否有更优雅的方式。

+1

存储列表服务需要什么?对于大多数我所遇到的按需生成自然数子列表的大多数目的而言,比存储所有自然数(或其任何大部分)要优雅得多。认为代表自然数而不是存储的流的懒惰评估。 –

+1

当然,使用发电机会更优雅。但是,我需要将整个列表写成与* sigh *兼容,我不允许重写旧程序。 – mac389

回答

2

由于该名单将需要8.8 TB的内存,这里有一个平凡解,以防止被需要:

loop_limit = uint64(2^40); 
ii = uint64(1); 
chunksize = 1000; 

fid = fopen('output.txt', 'w'); 
while ii < loop_limit 

    for jj = 1:chunksize   
     fprintf(fid, '%d\n', ii); 
     ii=ii+1; 
     if ii >= loop_limit 
      break; end  
    end 

end 

fclose(fid); 

没有列表创建过的任何地方;内存开销仅限于少数使用的变量。

请注意,您提供的列表(1:2^40)将超过Matlab的最大环路索引2147483647,这是双循环的原因。

还请注意,这个文件output.txt将占用8.8TB,所以...最好先释放一些硬盘空间。

现在很明显,这绝对是令人惊恐的。你能提供关于“旧”程序如何查询文件的更多信息吗?因为我有强烈的预感,有一些bash/DOS批处理技巧,您可以使用它来模拟包含这些数字的文件,而无需真正需要该文件。

+0

“旧”程序是一个C++程序,重建隐马尔可夫模型以表示二进制变量组的活动。如果有40个变量,则有2^40个人口活动状态。确实,有限自动机只需要知道它是处理有限字母表,但我没有时间(直到我的论文后)真正深入到协作者的代码中。而且他不愿意独自一人。 – mac389

相关问题