Как мне записать все записи из массивной коллекции MongoDB в файл csv, не занимая всю оперативную память? - PullRequest
0 голосов
/ 29 мая 2019

У меня есть коллекция, в которую я загрузил содержимое файла xml объемом 4 ГБ.В нем было около 14000000 записей.
Мне нужно записать эти записи в файл csv.Я использовал следующий фрагмент кода, думая, что он будет работать нормально, так как объекты читаются / записываются, как и когда они требуются.Однако, похоже, это не так.После запуска кода моя оперативная память сдается.Я использую mongoengine для использования базовой библиотеки PyMongo для операций с БД.

import csv
from xml_to_db import Users #This is my collection definition in a separate file

extract_user_fields = ['Id', 'Reputation', 'UpVotes', 'DownVotes']
users_file = 'users.csv'

with open(users_file, 'a', newline='') as f:
    for user_docs in Users.objects:
        user_document_dict = dict()
        for key in extract_user_fields:
            user_document_dict[key] = user_docs[key]
        # for simplicity we will update the csv file as soon as we have a record
        # write this document to the csv file
        writer = csv.DictWriter(f, extract_user_fields)
        writer.writerow(user_document_dict)

В mongoengine документах нигде не упоминается, что такой запрос БД может привести к проблемам с памятью, если коллекция огромна.

Более того, я не могу точно определить, какая строка ответственна за взрыв памяти.
Любая помощь будет высоко оценена.

1 Ответ

0 голосов
/ 29 мая 2019

Mongoengine кэширует все документы, выбранные по запросу, установленному по умолчанию, используйте следующее, чтобы отключить это поведение: for user_docs in Users.objects.no_cache():

...