打印字典并将其保存到文件中,然后将其复制到py文件中使用?

时间:2012-06-14 17:44:59

标签: python google-app-engine python-2.7 webapp2

使用数据库,我想创建一个非常大的字典。如果我将它保存到磁盘,当腌制时,它需要大约10 MB的空间。

我想做的是:

将此字典保存到磁盘,以打开该文本文档并将其复制到另一个py文件,以便每次通过Web调用py文档时都不必重新生成它应用程序,它是可迭代的。

我该怎么做?

PS。我的应用程序正在Google应用引擎上运行,我想解决这个问题,以避免使用DB等资源。

6 个答案:

答案 0 :(得分:6)

通过文件api:

将其存储到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()

注意:

  • 你无法修改blob以便修改它,你需要阅读dict 进入内存,删除blob,创建一个新的并替换键 该模型。
  • 字典越大,你就越有可能击中 软工艺大小限制。
  • 我使用元帅,但你可以使用泡菜, json或者你喜欢的任何东西。

您无法从GAE SDK写入文件: how to write or create (when no exist) a file using python and Google AppEngine

答案 1 :(得分:1)

首先,如果你的字典腌制需要10MB,那么如果将它存放在py文件中,它可能会占用更多的空间。如果您的词典只包含基本类型,则只能使用普通打印

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

还要考虑这种文件的加载时间是否相当可观。

其次,使用Google App Engine无法实现您的目标,因为您无法动态更改项目的来源。除非该词典永远不会改变。

Google应用引擎即使对数据存储区也有免费配额,所以我没有看到试图绕过它的重点。

答案 2 :(得分:1)

听起来你只想要一个可以加载为python的字典转储。这很容易:

>>> d = {'key': 'value'}
>>> print '%r' % (d, )
{'key': 'value'}
>>> print repr(d)
{'key': 'value'}
>>> open('/tmp/mydict.py', 'w').write(repr(d))

答案 3 :(得分:0)

GAE上文件的最大可接受大小为10,485,760字节。

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

此外,这种大小的字典听起来效率不高。您在数据存储调用中保存的内容可能会在运行应用程序所需的实例小时数内丢失。

最后,从成本和性能的角度来看,您最好只使用数据存储。

答案 4 :(得分:0)

您无法在App Engine中保存到磁盘。最接近的等价物是pickle并保存到blobstore。

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

您必须自己进行测试以确定性能是否值得,但Blobstore可能比发出查询以便反复重新生成此数据更便宜。

答案 5 :(得分:0)

说实话,我不明白为什么你会想要这样做,所以不能想出一个可能有帮助的想法。

你能澄清你想做什么而不是你想做什么吗?

虽然如果我正确地理解你想要做的是绕过资源使用。如果您使用该平台,则无法避免使用GAE资源。无论你做什么,你都会在App Engine上遇到某种类型的资源使用。您可以将字典放在数据存储区,blobstore或memcache中。您可以将数据发送到另一个网址,您可以下载并上传数据但仍在使用资源。