Если у вас нет памяти для выполнения open("big.file").read()
, то numpy на самом деле не поможет .. Он использует ту же память, что и переменные python (если у вас 1 ГБ ОЗУ, вы можете загрузить только 1 ГБ данных в numpy )
Решение простое - прочитать файл кусками .. f = open("big.file", "rb")
, затем выполнить серию f.read(500)
, удалить последовательность и записать ее обратно в другой объект файла. Практически как вы делаете чтение / запись файлов на C ..
Проблема в том, что если вы пропустите шаблон, который вы заменяете. Например:
target_seq = "567"
input_file = "1234567890"
target_seq.read(5) # reads 12345, doesn't contain 567
target_seq.read(5) # reads 67890, doesn't contain 567
Очевидное решение - начать с первого символа в файле, проверить len(target_seq)
символов, затем перейти на один символ вперед, проверить еще раз.
Например (псевдокод!):
while cur_data != "":
seek_start = 0
chunk_size = len(target_seq)
input_file.seek(offset = seek_start, whence = 1) #whence=1 means seek from start of file (0 + offset)
cur_data = input_file.read(chunk_size) # reads 123
if target_seq == cur_data:
# Found it!
out_file.write("replacement_string")
else:
# not it, shove it in the new file
out_file.write(cur_data)
seek_start += 1
Это не совсем эффективный способ, но он будет работать и не потребует сохранения копии файла в памяти (или двух).