我正在编写一个使用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的文件。 我如何加快速度?
我已经看了其他的问题,但没有一个似乎是相关的:
\0
或解决scheme仅为Windows 写块,而不是字节,并避免无故迭代大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)