2012-06-14 5 views
1

Используя БД, я хочу создать очень большой словарь. Если я сохраню его на диске, при мариновании он занимает около 10 МБ пространства.Распечатайте словарь и сохраните его в файл, а затем скопируйте его в файл py для использования?

То, что я хочу сделать, это:

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

Как я могу это сделать?

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

ответ

6

магазин его в Blobstore через файлы апи:

class YourDictModel(ndb.Model): 
    data = ndb.BlobKeyProperty() 

huge_dict = dict(...) 

file_name = files.blobstore.create(mime_type='application/octet-stream') 
with files.open(file_name, 'a') as f: 
    f.write(marshal.dumps(huge_dict)) 

    # Finalize the file. Do this before attempting to read it. 
    files.finalize(file_name) 

    # Get the file's blob key 
    blob_key = files.blobstore.get_blob_key(file_name) 
    entity = YourDictModel(data = blob_key) 

    entity.put() 

обратите внимание, что:

  • вы не можете изменить блоб так, чтобы изменить его, вам нужно будет прочитать Dict в память , удалите blob, создайте новый и замените ключ на модели.
  • Чем больше словарь, тем больше вероятность, что вы нажмете ограничение на размер мягкого процесса.
  • Я использую маршала, но вы можете использовать pickle, json или что хотите.

вы не можете записать в файл из GAE SDK: how to write or create (when no exist) a file using python and Google AppEngine

+1

Хороший призыв к маршалу, это самый быстрый и компактный из трех. Если blobstore недостаточно быстро для вас, вы можете нарезать строку, возвращаемую маршалом в блоки размером 1 М, и записать их в memcache с помощью какого-то систематического набора ключей. Вы можете писать/читать 32M данных в/из memcache, используя put_multi()/get_multi(), если каждое значение меньше 1M. –

1

Во-первых, если ваш словарь маринованный займет 10 МБ, он, вероятно, будет использовать больше места, чем если бы вы сохранили его в файле py. Если ваш словарь содержит только основные типы можно использовать просто обычный Распечатайте

>>> print 'mydict = %s' %({'a': [1,2], 2: 'c'},) 
mydict = {'a': [1, 2], 2: 'c'} 

Рассмотрим также, что время загрузки такого файла будет значительным.

Во-вторых, то, что вы хотите сделать, невозможно с помощью Google App Engine, потому что вы не можете динамически изменять источники вашего проекта. Если этот словарь никогда не изменится.

У Google app engine есть бесплатные квоты даже для хранилища данных, поэтому я не вижу смысла пытаться обойти его.

+0

Hello. Я создаю на своем dev. машина очень большая TRIE из БД. Я хочу, чтобы это было сохранено в виде словаря в памяти, чтобы я получил время. Создание этого дерева занимает немного времени от БД, поэтому я хочу, чтобы он находился в файле py, поэтому всякий раз, когда вызывается файл, он будет уже в памяти, ожидающем использования. Я хочу достичь этого на моем компьютере-разработчике и просто загрузить py на сервер. Я знаю, как печатать dict, но как я могу создать текстовый документ utf-8, где он написан? – Phil

+1

Проблема с этим решением заключается в том, что это не гарантирует, что ваши экземпляры будут постоянно работать, поэтому, когда GAE создает новый экземпляр, потребуется много времени для загрузки. Каков ваш прецедент, если вы используете попытки, я предполагаю, что вы хотите выполнить какой-то поиск, и в этом случае может оказаться полезным полнотекстовый поиск api. Для создания файла вы можете использовать fd = open ('mytrie.py', 'w') fd.write ('mytrie =% s'% (mytrie,)) fd.close(). И тогда просто сделайте в своем коде из mytrie import mytrie –

+0

. Я проверю вариант полнотекстового поиска как решение в этом прецеденте. Также большое спасибо за объяснение того, что я искал. Очень любезно с тобой, спасибо тебе снова. – Phil

0

Максимально допустимый размер файла для GAE составляет 10 485 760 байт.

Uploading, Downloading, and Managing a Python App - Google Developers

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

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

+0

Это ограничение предназначено для файлов приложений. Если он пытается создать файл, он может хранить более крупный файл в BlobStore. – dragonx

+0

Или я могу разделить на два файла py. Но это не мое беспокойство. Меня беспокоит, что я не понимаю, как печатать словарь в текстовом документе юникода на моем собственном компьютере разработки. Спасибо. – Phil

0

Вы не можете сохранить на диск в App Engine. Самый близкий эквивалент - рассолить и сохранить в блоб-магазине.

https://developers.google.com/appengine/docs/python/blobstore/

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

+0

Я хочу сделать это на своем dev. который будет загружен только как файл py на сервер. Как я могу написать этот большой дикт. в текстовый файл utf8? Это то, что я действительно удивляюсь. Спасибо. – Phil

0

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

Можете ли вы разъяснить, что вы пытаетесь сделать, а не то, что вы хотите сделать?

Хотя, если я правильно понимаю вас, то, что вы хотите сделать, это обойти использование ресурсов. Нет способа избежать использования ресурсов GAE, если вы используете платформу. Независимо от того, что вы делаете, вы собираетесь использовать некоторые виды использования ресурсов в App Engine. Вы помещаете словарь в хранилище данных, blobstore или memcache. Вы можете отправить данные на другой URL-адрес, вы можете загрузить и загрузить данные, но вы все еще используете ресурсы.

+0

У меня таблица БД вроде списка слов. Я выполняю на нем частые сложные алгоритмы поиска. SQL медленный и занимает много памяти. Мое решение: преобразовать его в TRIE, сохранить его в пользовательской хеш-таблице словарей и использовать его. Создание этого означает переход через БД, и он слишком длинный. Я хочу избежать этого для каждого поиска. Я хочу, чтобы TRIE хранился в памяти, создавался только один раз и обращался много раз. Поскольку это веб-приложение, 10 человек могут сделать 10 запросов на его использование. И это занимает более 1 МБ в памяти, больше как 10. Однако я могу распространять его в случае memcache. – Phil

+0

Почему бы не вычислить файл в процессе производства? Вы можете использовать [бэкэнд-сервис] (https://developers.google.com/appengine/docs/python/backends/) для выполнения вычислений, которые не будут вписываться в ограничение на 1 минуту. Затем вы можете использовать memcache, чтобы сделать приложение более эффективным. Единственное, что я могу придумать, это использовать JSON для загрузки данных на сервер, вам все равно придется сбрасывать их в blobstore и memcache. JSONPickle - это то, что я видел в сообщениях https://github.com/jsonpickle/jsonpickle. Я не использовал его. Вот сообщение JSON vs Pickle http: // kovshenin.com/2010/pickle-vs-json-which-is-faster/ –

1

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

>>> d = {'key': 'value'} 
>>> print '%r' % (d,) 
{'key': 'value'} 
>>> print repr(d) 
{'key': 'value'} 
>>> open('/tmp/mydict.py', 'w').write(repr(d)) 
Смежные вопросы