Возобновление записи большого файла в Python - PullRequest
4 голосов
/ 26 июля 2010

У меня большая передача файлов (скажем, 4 ГБ или около того), и вместо того, чтобы использовать shutil, я просто открываю и записываю его обычным способом, чтобы я мог включить процент прогресса по мере его продвижения.

Затем мне пришло в голову попытаться возобновить запись в файл, если по какой-то причине он прекратился во время процесса. Мне не повезло, хотя. Я предположил, что это будет разумная комбинация смещения чтения исходного файла и использования поиска, но пока мне не повезло. Есть идеи?

Кроме того, существует ли какой-то динамический способ определить, какой размер блока использовать при чтении и записи файлов? Я довольно новичок в этой области, и просто прочитал, чтобы использовать больший размер для большего файла (в данный момент я использую 65536). Есть ли умный способ сделать это, или можно просто догадаться ..? Спасибо, ребята.

Вот фрагмент кода передачи добавляющегося файла:

                newsrc = open(src, 'rb')
                dest_size = os.stat(destFile).st_size
                print 'Dest file exists, resuming at block %s' % dest_size
                newsrc.seek(dest_size)
                newdest = open(destFile, 'a')
                cur_block_pos = dest_size
                # Start copying file
                while True:
                    cur_block = newsrc.read(131072)                    
                    cur_block_pos += 131072
                    if not cur_block:
                        break
                    else:
                       newdest.write(cur_block)

Он добавляет и начинает запись, но затем записывает dest_size данных в конце больше, чем это должно быть по понятным причинам для остальных из вас. Есть идеи?

1 Ответ

1 голос
/ 26 июля 2010

Что касается второй части вашего вопроса, данные обычно считываются и записываются на жесткий диск блоками по 512 байт.Таким образом, использование размера блока, кратного этому, должно обеспечить наиболее эффективную передачу.Кроме этого, это не имеет большого значения.Просто помните, что независимо от того, какой размер блока вы указываете, это объем данных, который операция ввода-вывода хранит в памяти в любой момент времени, поэтому не выбирайте что-то настолько большое, чтобы оно занимало много памяти.Я думаю, что 8K (8192) - это обычный выбор, но 64K должно быть хорошо.(Я не думаю, что размер передаваемого файла имеет большое значение, когда вы выбираете лучший размер блока)

...