根据文件大小将大文件拆分为多个文件

时间:2019-05-05 20:34:47

标签: python-3.x file split line filesize

我有一个.log文件,大小超过1GB。我想根据文件大小将此文件拆分为多个文件。我下面有代码来拆分它。但是处理给定的日志文件然后分割它需要花费时间。

我的代码:

import subprocess
import math
import os
import json

file_path = "path/to/file"
file_size = os.path.getsize(file_path)
MAX_SIZE = 300000000
if file_size > MAX_SIZE:
    file_lines_str = str(subprocess.check_output(["wc", "-l", file_path]))
    num_of_files = math.ceil(file_size / MAX_SIZE)
    print(" Num of files", ":", num_of_files)
    file_lines = file_lines_str.split(" ")[0].split("'")[1]
    print("file_line is", " ", file_lines)
    file_lines_to_be_read = math.ceil(int(file_lines) / num_of_files)
    print("file lines to be read:", " ", file_lines_read)
    with open(file_path) as infile:
        for file_num in range(0, num_of_files):
            seek_lines = file_num * file_lines_read
            print("Seek_lines", seek_lines)
            max_size_file = (file_num + 1) * file_lines_read
            print("max_size_file", max_size_file)
            output_file_name = "file_name_" + "_" + str(file_num)

            with open(output_file_name, "a") as output:
                i = seek_lines
                while i < max_size_file:
                    line = infile.readline()
                    output.write(line)
                    i = i + 1
    os.remove(file_path)

此代码在某种程度上是无效的:

1)我正在使用readline,它将完整的日志文件读入内存。这不是内存有效的方法。

2)我正在分行,counting lines-也需要一些时间。

还有其他方法可以优化并有效地解决此问题?我确定那里应该有东西。

1 个答案:

答案 0 :(得分:0)

Python非常好。 但是口译员不太可能胜过/usr/bin/split -l 为了提高速度或效率。

实际上, 许多日志文件的行长“很无聊”, 因为它们相差不大, 他们不在开始处有十二个字符行,在结尾处有千个字符行。 如果您愿意接受这样的假设, 然后只需“品尝”前k = 100行, 并计算它们的长度之和。 然后avg_line_length = total_length / k。 使用getsize()获取文件大小。 将其除以avg_line_length即可得出文件中的估计行数。

比运行wc -l快得多。