Я использую решение, данное в этом потоке S / O Более эффективный способ засечь строку . А именно,
import zlib, cPickle
def zdumps(obj):
return zlib.compress(cPickle.dumps(obj,cPickle.HIGHEST_PROTOCOL),9)
def zloads(zstr):
return cPickle.loads(zlib.decompress(zstr))
Это работает, если я выгружаю всю строку в файл. Например:
with open("mystring.txt", "wb") as f:
f.write(zdumps(MYBIGSTRING.encode()))
Затем я могу открыть файл с чем-то вроде
with open("mystring.txt", 'rb') as f:
string_ = zloads(f.read()).decode("utf-8")
. Это загружает все значения MYBIGSTRING
в string_
. Мои строки огромны, поэтому на моем ноутбуке 8 ГБ не хватает оперативной памяти.
Итак, я хочу разбить MYBIGSTRING
на строки, а затем вывести каждую строку в файл, затем прочитать и обработать каждую строку, избегая, таким образом, полного хранения MYBIGSTRING
в памяти.
Моя попытка сделать что-то вроде этого:
with open("mystring.txt", "wb") as f:
f.write(zdumps("\n".encode()))
f.write(zdumps(my_sub_string.encode()))
Закончив запись, я хочу прочитать ее по строкам и обработать каждую строку.
with open("mystring.txt", 'rb') as f:
for line in f:
my_sub_string_ = zloads(line).decode()
# process my_sub_string
Но я получаю следующее сообщение об ошибке
zlib.error: Error -3 while decompressing data: incorrect header check
Как мне обойти это?