我有一个包含约500k文件的目录,并想将它们切成t
tar文件。
把正式,让我们叫的文件file_0, ..., file_{N-1}
,其中N
围绕500K。我想创建t
每个包含T=N/t
文件的tar文件,其中第i个tar文件包含
file_(i*N), ..., file_((i+1)*N - 1), i in {0, ..., t-1}
什么是有效的方法?我打算编写一个Python脚本,该脚本仅循环遍历N
文件并将它们划分为t
文件夹,然后tar
在每个文件夹中调用,但这感觉不是很理想。我在服务器上有很多核心,觉得应该并行发生。
您可以使用pythonconcurrent
库,该库旨在处理所有或某些线程之间的请求队列,直到所有作业完全执行后才占用队列。
[ [f0..f0-1], [fn..f2n-1]..]
ThreadPoolExecutor
清单吃您的计算机拥有的所有许多线程的列表。看起来可能像这样:import os
import sys
from concurrent.futures import ThreadPoolExecutor
import subprocess
import itertools
import math
def main(p, num_tar_files):
files = list(split_files_in(p, num_tar_files))
tar_up = tar_up_fn(p)
with ThreadPoolExecutor(len(files)) as executor:
archives = list(executor.map(tar_up, itertools.count(), files))
print("\n {} archives generated".format(len(archives)))
def split_files_in(p, num_slices):
files = sorted(os.listdir(p))
N = len(files)
T = int(math.ceil(N / num_slices)) # means last .tar might contain <T files
for i in range(0, N, T):
yield files[i:i+T]
def tar_up_fn(p):
def tar_up(i, files):
_, dir_name = os.path.split(p)
tar_file_name = "{}_{:05d}.tar".format(dir_name, i)
print('Tarring {}'.format(tar_file_name))
subprocess.call(["tar", "-cf", tar_file_name] + files, cwd=p)
return tar_file_name
return tar_up
if __name__ == '__main__':
main(sys.argv[1], int(sys.argv[2]))
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句