Быстрое соединение файлов в Python и получение их md5

1

Я пытаюсь разбить файл на более мелкие куски +/- 300 килобайт. Это довольно медленно для файла размером 300 мегабайт (+/- 1000 штук).

Я еще не использую нити, я не уверен, что это ускорит выполнение

    cs = 1
    pieces = 1000

    # Open the file
    f = open(self.file, 'rb')
    result = {}

    while cs <= pieces:

        #Filename
        filename = str(cs).zfill(5) + '.split'

        # Generate temporary filename
        tfile = filename

        # Open the temporary file
        w = open(tfile, 'wb')

        # Read the first split
        tdata = f.read(maxsize)

        # Write the data
        w.write(tdata)

        # Close the file
        w.close()

        # Get the hash of this chunk
        result[filename] = self.__md5(tfile)

        cs += 1

Это функция md5:

def __md5(self, f, block_size=2**20):

    f = open(f, 'rb')

    md5 = hashlib.md5()
    while True:
        data = f.read(block_size)
        if not data:
            break
        md5.update(data)
    return md5.hexdigest()

Итак, есть ли способ ускорить процесс?

  • 0
    Будет ли эта проблема лучше решена с помощью split(1) ?
  • 0
    Я не уверен, насколько многопоточность здесь поможет, так как MD5 очень быстр, и вы, вероятно, связаны с вводом / выводом. Вы можете легко попробовать это, поскольку блоки могут быть хэшированы независимо. В этом случае я рекомендую использовать поток для каждого ядра / процессора.
Теги:
file-io
md5

1 ответ

4
Лучший ответ

Вы читаете кусок, сохраняете его во временном файле, затем читаете временный файл и вычисляете его md5. Однако это лишнее - вы можете вычислить md5, пока блок все еще находится в памяти. Это означает, что вам не придется открывать временный файл и читать его, что должно быть быстрее.

Также я бы рекомендовал меньший размер блока - возможно, 2 ^ 11 или 2 ^ 12.

  • 1
    Договорились о временном файле, он не нужен и неэффективен. Но почему меньший размер блока? Использование большого размера блока означает, что на циклы Python тратится меньше времени, за счет чего требуется больше памяти.
  • 0
    а может быть, трудно иметь 1 МБ непрерывной памяти по требованию? поэтому выделение памяти может занять некоторое время, но это проще с меньшими блоками. просто случайная догадка, хотя у меня нет данных, чтобы поддержать это

Ещё вопросы

Сообщество Overcoder
Наверх
Меню