сохранение содержимого файла в памяти

1

У меня есть довольно большой файл маринованного (dict) в двоичном формате, который занимает несколько секунд, чтобы загружать каждый раз, когда я просматриваю счет. Мне было интересно, можно ли загрузить файл только один раз в памяти и посмотреть на него, пока я не выйду из программы. Кроме того, если есть какой-либо другой способ ускорить мой поиск.
Спасибо заранее.

Теги:

5 ответов

2
Лучший ответ

Когда у меня возникает такая проблема, я обычно создаю функцию и украшаю ее с помощью memoize decorator. Найдите "Memoize" на http://wiki.python.org/moin/PythonDecoratorLibrary

Например:

@memoized
def get_dict():
    return pickle.load(file)

foo = get_dict()['foo']

Использование memoization здесь вместо того, чтобы делать это при загрузке, делает это случаем лениво, поэтому, если вы не используете файл во время некоторых видов использования программы, вы не платите за ее загрузку.

Кроме того, как и другой плакат, вы должны использовать cPickle:

import cPickle as pickle

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

2

Загрузите данные, а затем передайте эту ссылку, а не загружайте ее каждый раз, когда вы просматриваете свой счет. Теперь я не знаю, как выглядит ваш код, но простой пример:

def lookup(data):
    // do stuff with data

data = Pickle.load("file")
lookup(data)
1

использовать модуль cPickle вместо Pickle будет ускорять механизм рассола, но сохранить неиспаренный dict в памяти - хорошая идея.

1

shelve является альтернативой.

0

Сделайте свой код в модуль (который в основном просто включает его в отдельный файл), а затем загрузите модуль, если вам нужно выполнить некоторые поиски.

Пусть модуль инициализирует свою переменную data. Это произойдет только при первом импорте. Если другие части вашей программы import того же модуля, системная кешированная версия будет автоматически использоваться, а код в ней не будет запущен снова.

mymodule.py

import pickle
data = pickle.load(open("picklefile", "rb"))

program.py

import mymodule
value = mymodule.data[key]

Ещё вопросы

Сообщество Overcoder
Наверх
Меню