Разделить большие файлы на несколько файлов в зависимости от размера файла Python - PullRequest
0 голосов
/ 05 мая 2019

У меня есть файл .log размером более 1 ГБ. Я хочу разбить этот файл на несколько файлов в зависимости от размера файла. У меня есть код ниже, чтобы разделить его. Но требуется время, чтобы обработать данный файл журнала и затем разделить его.

Мой код:

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 голосов
/ 06 мая 2019

Python очень хороший.Но вряд ли интерпретатор сможет побить / usr / bin / split -l по скорости или эффективности.

Кстати, на практике многие файлы журналов имеют «скучные» длины строкв том смысле, что они не сильно различаются, например, они не имеют двенадцатизначных строк в начале и тысячных строк в конце.Если вы готовы жить с такими предположениями, просто «попробуйте» первые k = 100 строк и вычислите сумму их длин.Тогда avg_line_length = total_length / k.Получите размер файла с getsize().Разделите это на avg_line_length, чтобы получить приблизительное количество строк в файле.

Гораздо быстрее, чем wc -l.

...