0
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) 以加快执行速度。

有任何想法吗?

4

1 回答 1

1

您不能同时将多个文件写入同一个 tarfile。如果您尝试这样做,这些块将混合在一起,并且无法提取它们。

您可以通过启动多个线程来做到这一点,然后每个线程都可以打开一个 tarfile,写入它,然后关闭它。

我相信您可能可以端到端加入 tarfile。通常,这将涉及到最后读取 tar 文件,但由于这一切都在内存中(并且可能大小足够小以允许这样做),这不会是一个太大的问题。

如果您采用这种方法,您不希望有 5000 个单独的线程 - 5000 个线程会使盒子停止响应(至少有一段时间),并且压缩会很糟糕。将自己限制为每个处理器 1 个线程,并按线程划分工作。

此外,您编写的代码将创建一个包含 5000 个文件的 tar,所有文件都称为 1_5.data,内容为“bigstringhere...”。我假设这只是一个例子。如果没有,请创建一个包含单个文件的 tarfile,关闭它(以刷新它),然后将结果复制 5000 次(例如,如果您想将其写入磁盘,只需将整个 BytesIO 写入 5000 次)。

我相信其中最昂贵的部分是压缩——您可以使用外部程序“pigz”,它并行执行 gzip 压缩。

于 2018-11-07T02:35:15.513 回答