我有一个.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
-也需要一些时间。
还有其他方法可以优化并有效地解决此问题?我确定那里应该有东西。
答案 0 :(得分:0)
Python非常好。 但是口译员不太可能胜过/usr/bin/split -l 为了提高速度或效率。
实际上,
许多日志文件的行长“很无聊”,
因为它们相差不大,
他们不在开始处有十二个字符行,在结尾处有千个字符行。
如果您愿意接受这样的假设,
然后只需“品尝”前k = 100行,
并计算它们的长度之和。
然后avg_line_length = total_length / k
。
使用getsize()
获取文件大小。
将其除以avg_line_length
即可得出文件中的估计行数。
比运行wc -l
快得多。