如何有效地分配预定义大小的文件,并用Python填充非零值?

我正在编写一个使用dynamic编程来解决一个难题的程序。 DP解决scheme需要存储大型表格。 全桌占用约300 Gb。 物理上它存储在40〜7Gb的文件中。 我用byte \xFF标记未使用的表项。 我想快速为这个表分配空间。 该程序将不得不在Windows和Linux下运行。

简而言之,我想要以跨平台的方式高效地创build填充了特定字节的大文件。

这是我目前使用的代码:

 def reset_storage(self, path): fill = b'\xFF' with open(path, 'wb') as f: for _ in range(3715948544 * 2): f.write(fill) 

它需要大约40分钟来创build一个7 GB的文件。 我如何加快速度?

我已经看了其他的问题,但没有一个似乎是相关的:

  • 在Python中用python分配一个特定大小的文件 – 没有答案
  • 在python中创build特定大小的文件 – 文件被填充为\0或解决scheme仅为Windows
  • 如何在Linux中创build一个给定大小的文件? – 所有的解决scheme都是Linux专用的

写块,而不是字节,并避免无故迭代大range

 import itertools def reset_storage(self, path): total = 3715948544 * 2 block_size = 4096 # Tune this if needed, just make sure it's a factor of the total fill = b'\xFF' * block_size with open(path, 'wb') as f: f.writelines(itertools.repeat(fill, total // block_size)) # If you want to handle initialization of arbitrary totals without # needing to be careful that block_size evenly divides total, add # a single: # f.write(fill[:total % block_size]) # here to write out the incomplete block. 

理想的块大小将因系统而异。 一个合理的选择是使用io.DEFAULT_BUFFER_SIZE来匹配写入和自动刷新,同时仍然保持内存使用率低。

你的问题是调用python方法经常(每个字节!)。 我所提供的肯定不是完美的,但会快很多倍地工作。 尝试以下操作:

 fill = b"\xFF" * 1024 * 1024 # instantly 1 MiB of ones ... file_size = 300 * 1024 # in MiB now! with open(path, 'wb') as f: for _ in range(file_size): f.write(fill)