import tarfile
from cStringIO import StringIO
from io import BytesIO as BIO
unique_keys = ['1:bigstringhere...:5'] * 5000
file_out = BytesIO()
tar = tarfile.open(mode='w:bz2', fileobj=file_out)
for k in unique_keys:
id, mydata, s_index= k.split(':')
inner_fname = '%s_%s.data' % (id, s_index)
info = tarfile.TarInfo(inner_fname)
info.size = len(mydata)
tar.addfile(info, StringIO(mydata))
tar.close()我想做上面的循环,以便并行地添加到tarfile (tar)中,以便更快地执行。
有什么想法吗?
发布于 2018-11-07 10:35:16
您不能同时将多个文件写入同一个tarfile。如果您尝试这样做,这些块将会混合在一起,并且不可能提取它们。
您可以通过启动多个线程来完成此操作,然后每个线程都可以打开一个tarfile,对其进行写操作,然后将其关闭。
我相信您可以端到端地加入tarfiles。通常,这需要在最后读回tarfile文件,但由于这些文件都在内存中(大概大小已经足够小了),所以这不是什么大问题。
如果你采用这种方法,你不会想要5000个单独的线程-- 5000个线程会让机器停止响应(至少在一段时间内),而且压缩会很糟糕。将自己限制为每个处理器只能有一个线程,并用线程来划分工作。
此外,您编写的代码将创建一个包含5000个文件的tar文件,所有文件都名为1_5.data,内容为"bigstringhere...“。我假设这只是一个例子。如果没有,创建一个包含单个文件的BytesIO文件,关闭它(刷新它),然后将结果复制5000次(例如,如果您想要将其写入磁盘,只需将整个tarfile写入5000次)。
我认为最昂贵的部分是压缩-你可以使用外部程序'pigz',它并行地执行gzip压缩。
https://stackoverflow.com/questions/19378610
复制相似问题