1

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

我想做的是:

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

我怎样才能做到这一点?

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

4

6 回答 6

6

通过 files 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,创建一个新 blob 并替换模型上的键。
  • 字典越大,您就越有可能达到软进程大小限制。
  • 我使用 marshal,但你可以使用 pickle、json 或任何你喜欢的东西。

您无法从 GAE SDK 写入文件: 如何使用 python 和 Google AppEngine 编写或创建(当不存在时)文件

于 2012-06-14T20:16:49.607 回答
1

首先,如果你的字典腌制需要 10MB,它可能会比你将它直接存储在 py 文件中使用更多的空间。如果您的字典仅包含基本类型,则可以仅使用普通打印

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

还要考虑到此类文件的加载时间将相当长。

其次,使用 Google App Engine 无法实现您想要做的事情,因为您无法动态更改项目的来源。除非那本词典永远不会改变。

谷歌应用引擎甚至对数据存储也有免费配额,所以我看不出试图绕过它的意义。

于 2012-06-14T17:59:47.683 回答
1

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

>>> d = {'key': 'value'}
>>> print '%r' % (d, )
{'key': 'value'}
>>> print repr(d)
{'key': 'value'}
>>> open('/tmp/mydict.py', 'w').write(repr(d))
于 2012-06-14T21:04:54.433 回答
0

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

上传、下载和管理 Python 应用 - Google Developers

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

最后,从成本和性能的角度来看,仅使用数据存储可能会更好。

于 2012-06-14T18:09:30.447 回答
0

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

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

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

于 2012-06-14T18:10:31.933 回答
0

老实说,我不明白您为什么要尝试这样做,因此无法想出可能有帮助的想法。

你能澄清你试图做什么而不是你想做的事情吗?

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

于 2012-06-14T20:03:47.247 回答