Как сделать эту память скрипта Python эффективной - PullRequest
1 голос
/ 23 мая 2011

Этот фрагмент извлекает все документы из моей базы данных и выгружает их в сжатый 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

1 Ответ

2 голосов
/ 23 мая 2011

Я думаю, что Андрюски может быть прав.Если вы не работаете, попробуйте настроить ваш запрос на использование метода итератор

что-то вроде.

docs_to_dump = Document.objects.all().order_by('court').iterator()

Не следует загружать весь набор запросов в память.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...