Потребление памяти модулем полки Python - PullRequest
6 голосов
/ 24 мая 2011

Мне было поручено прочитать файл .txt, который представляет собой журнал различных событий, и записать некоторые из этих событий в словарь.

Проблема в том, что иногда файл может иметь размер больше 3 ГБ.по размеру.Это означает, что словарь становится слишком большим, чтобы поместиться в основную память.Кажется, что Shelve - хороший способ решить эту проблему.Однако, поскольку я буду постоянно изменять словарь, у меня должна быть включена опция writeback.Это то, что меня беспокоит - в руководстве говорится, что это замедлит процесс чтения / записи и увеличит использование памяти, но я не могу найти статистику о том, как влияют на скорость и память.насколько сильно зависит скорость чтения / записи и память, так что я могу решить, использовать ли опцию обратной записи или пожертвовать некоторой читабельностью для эффективности кода?

Спасибо

1 Ответ

1 голос
/ 30 мая 2015

Для баз данных такого размера, полка действительно не тот инструмент. Если вам не нужна высокодоступная архитектура клиент / сервер, и вы просто хотите преобразовать свой файл TXT в локальную базу данных, доступную в памяти, вам действительно следует использовать ZODB

Если вам нужно что-то высокодоступное, вам, конечно, нужно переключиться на формальную базу данных «NoSQL», из которой есть из чего выбирать.

Вот простой пример того, как преобразовать базу данных полки в базу данных ZODB, которая решит проблемы использования / производительности памяти.

#!/usr/bin/env python
import shelve
import ZODB, ZODB.FileStorage
import transaction
from optparse import OptionParser
import os
import sys
import re

reload(sys)
sys.setdefaultencoding("utf-8")

parser = OptionParser()

parser.add_option("-o", "--output", dest = "out_file", default = False, help ="original shelve database filename")
parser.add_option("-i", "--input", dest = "in_file", default = False, help ="new zodb database filename")

parser.set_defaults()
options, args = parser.parse_args()

if options.in_file == False or options.out_file == False :
    print "Need input and output database filenames"
    exit(1)

db = shelve.open(options.in_file, writeback=True)
zstorage = ZODB.FileStorage.FileStorage(options.out_file)
zdb = ZODB.DB(zstorage)
zconnection = zdb.open()
newdb = zconnection.root()

for key, value in db.iteritems() :
    print "Copying key: " + str(key)
    newdb[key] = value
                                                                                                                                                                                                
transaction.commit() 
...