按文件数拆分 gzip 文件
Split gzip file by file count
我有一个很大的 tar.gz 文件,其中包含数百万 xml 个文件。
linux中的split
命令可以按字节数/行数拆分,但不能按文件数拆分。例如,我想将 gzip 文件拆分为每个输出子 gzip 中的 300k 个文件。有实现此目的的实用程序吗?
我的最终目标是处理 Python 中的 tar.gz,我需要将文件拆分成更小的块以保留文件。拆分将允许并行处理它们。
因为split
不支持按文件数拆分,我实现了一个Python实用程序:
import tarfile
import glob
import os
import shutil
def make_a_split(input_dir, split_num):
print("split {}".format(split_num))
tar_output = tarfile.open("split_" + str(split_num) + ".tar.gz", "w:gz")
for file_name in glob.glob(os.path.join(input_dir, "*")):
#print(" Adding %s..." % file_name)
tar_output.add(file_name, os.path.basename(file_name))
tar_output.close()
shutil.rmtree(tmp_output_dir)
print("split {} done".format(split_num))
count_per_split = 300000
split = 1
tmp_output_dir = "tmp/"
tar = tarfile.open('your.tar.gz')
for idx, tarinfo in enumerate(tar):
tar.extract(tarinfo, tmp_output_dir)
if idx > 0 and idx % count_per_split == 0:
make_a_split(tmp_output_dir, split)
split += 1
tar.close()
# did we not remove the temp dir? It means we have seen less than count_per_split and need
# to make a split
if os.path.exists(tmp_output_dir):
make_a_split(tmp_output_dir, split)
我有一个很大的 tar.gz 文件,其中包含数百万 xml 个文件。
linux中的split
命令可以按字节数/行数拆分,但不能按文件数拆分。例如,我想将 gzip 文件拆分为每个输出子 gzip 中的 300k 个文件。有实现此目的的实用程序吗?
我的最终目标是处理 Python 中的 tar.gz,我需要将文件拆分成更小的块以保留文件。拆分将允许并行处理它们。
因为split
不支持按文件数拆分,我实现了一个Python实用程序:
import tarfile
import glob
import os
import shutil
def make_a_split(input_dir, split_num):
print("split {}".format(split_num))
tar_output = tarfile.open("split_" + str(split_num) + ".tar.gz", "w:gz")
for file_name in glob.glob(os.path.join(input_dir, "*")):
#print(" Adding %s..." % file_name)
tar_output.add(file_name, os.path.basename(file_name))
tar_output.close()
shutil.rmtree(tmp_output_dir)
print("split {} done".format(split_num))
count_per_split = 300000
split = 1
tmp_output_dir = "tmp/"
tar = tarfile.open('your.tar.gz')
for idx, tarinfo in enumerate(tar):
tar.extract(tarinfo, tmp_output_dir)
if idx > 0 and idx % count_per_split == 0:
make_a_split(tmp_output_dir, split)
split += 1
tar.close()
# did we not remove the temp dir? It means we have seen less than count_per_split and need
# to make a split
if os.path.exists(tmp_output_dir):
make_a_split(tmp_output_dir, split)