Этот фрагмент извлекает все документы из моей базы данных и выгружает их в сжатый gzip файл. docs_to_dump - это объект django, содержащий все текстовые документы, которые будут выгружены.
os.chdir(dump_dir)
filename = 'latest-' + court_id + '.xml.gz.part'
with myGzipFile(filename, mode='wb') as z_file:
z_file.write('<?xml version="1.0" encoding="utf-8"?>\n<opinions dumpdate="' + str(date.today()) + '">\n')
for doc in docs_to_dump:
row = etree.Element("opinion",
dateFiled = str(doc.dateFiled),
precedentialStatus = doc.documentType,
local_path = str(doc.local_path),
time_retrieved = str(doc.time_retrieved),
download_URL = doc.download_URL,
caseNumber = doc.citation.caseNumber,
caseNameShort = doc.citation.caseNameShort,
court = doc.court.get_courtUUID_display(),
sha1 = doc.documentSHA1,
source = doc.get_source_display(),
id = str(doc.documentUUID),
)
if doc.documentHTML != '':
row.text = doc.documentHTML
else:
row.text = doc.documentPlainText.translate(null_map)
z_file.write(' ' + etree.tostring(row).encode('utf-8') + '\n')
# Close things off
z_file.write('</opinions>')
К сожалению, он также потребляет столько памяти, что операционная система обнуляет его. Я думал, что при записи в «File-like object» сжатый файл будет создан «на лету», а объем памяти останется относительно низким. Вместо этого он занимает сотни МБ, а затем вылетает.
Я не специалист по сжатию, но у меня сложилось впечатление, что весь сжатый файл сохраняется в памяти.
Есть ли лучший способ, которым я должен это делать?
РЕДАКТИРОВАТЬ - Весь файл здесь: https://bitbucket.org/mlissner/search-and-awareness-platform-courtlistener/src/2ca68efd8017/data-dumps/data-dumper.py