2012-06-14 44 views
1

使用数据库,我想创建一个非常大的字典。如果我将它保存到磁盘上,则在腌制时需要大约10 MB的空间。打印字典并将其保存到文件中,然后将其复制到py文件中以供使用?

我想要做的是:

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

我怎样才能做到这一点?

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

回答

6

其存储到Blob存储区通过文件API:

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所以要修改它,你将需要阅读字典 到内存,删除blob,创建一个新的模型并替换 模型上的密钥。
  • 字典越大越有可能打到 的软件进程大小限制。
  • 我使用元帅,但你可以使用泡菜, JSON或任何你喜欢的。

你不能写在GAE SDK文件: how to write or create (when no exist) a file using python and Google AppEngine

+1

元帅的好声音,是三者中速度最快,最紧凑的。如果blobstore对于你来说速度不够快,你可以将由编组返回的字符串切成1M大小的块,然后用某种系统化的键将它们写入memcache。只要每个值低于1M,就可以使用put_multi()/ get_multi()将数据写入/读取到32位数据到/从memcache。 –

1

首先,如果你的字典腌制需要10MB,它可能会使用更多的空间,如果你把它存放在一个py文件中。如果你的字典里只包含基本的类型可以使用只是一个普通的打印

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

考虑也是这样的文件的加载时间将相当可观。

第二,您想要做的事不可能使用Google App Engine,因为您无法动态更改项目的来源。除非该字典永远不会改变。

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

+0

你好。我正在创造我的开发。从数据库中加入一个非常大的TRIE。我想把它作为字典存储在内存中,这样我就可以获得时间。创建这个树需要一点点时间从数据库,所以我希望它在一个py文件,所以无论何时调用文件,它将已经在内存中等待使用。我想在我的开发计算机上实现这一点,并将py上传到服务器。我知道如何打印字典,但我怎样才能创建一个utf-8纯文本文件的地方? – Phil

+1

这个解决方案的问题在于不能保证你的实例会一直运行,所以无论GAE何时创建一个新的实例,都需要花费相当多的时间来加载。你的用例是什么,如果你正在使用try,我想你想要执行某种搜索,在这种情况下,全文搜索API可能会有用。 用于创建文件,您可以使用fd = open('mytrie.py','w')fd.write('mytrie =%s'%(mytrie,))fd.close()。然后只需在mytrie的代码中输入mytrie –

+0

我将在此用例中检查全文搜索选项作为解决方案。也非常感谢你解释我在找什么。非常友善,再次感谢你。 – Phil

0

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

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

而且,这种规模的字典不健全,效率非常高。数据存储调用中保存的内容可能会丢失运行应用程序所需的实例小时数。

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

+0

该限制适用于应用程序文件。如果他试图生成一个文件,他可以在BlobStore中存储一个更大的文件。 – dragonx

+0

或者我可以分成两个py文件。但那不是我关心的问题。我担心的是,我无法理解如何在自己的开发计算机上将字典打印到unicode文本文档中。谢谢。 – Phil

0

您无法在App Engine中保存到磁盘。最接近的相当于腌制和保存到blobstore。

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

你必须做你自己的测试,看看性能是值得的,但Blob存储可能比发出查询一遍又一遍地再生该数据更便宜。

+0

我想在我的开发中做到这一点。机器仅作为py文件上传到服务器。我怎么写这个大字典。成纯文本的utf8文件?这就是我真正想知道的。谢谢。 – Phil

0

说实话,我看不出为什么你会想这样做,所以不能想出一个可能有用的想法。

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

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

+0

我有一个数据库表有点像一个单词列表。我对它执行频繁的复杂查找算法。 SQL很慢并且占用大量内存。我的解决方案:将其转换为TRIE,将其存储在字典的自定义散列表中并使用它。创建它意味着要通过数据库,它太长了。我想避免每个查找这个。我希望将TRIE存储在内存中,只创建一次并访问多次。由于这是一个网络应用程序,10人可能会提出10个请求来使用它。而且它在内存中占用的内存超过1 MB,更像是10.但是,我可以在内存缓存的情况下分发它。 – Phil

+0

为什么不计算生产中的文件?您可以使用[后端服务](https://developers.google.com/appengine/docs/python/backends/)进行不符合1分钟请求限制的计算。然后,您可以使用memcache来提高应用的效率。我唯一能想到的其他事情是使用JSON将数据上传到服务器,您仍然必须将其转储到blobstore和memcache中。 JSONPickle是我在帖子中看到的内容https://github.com/jsonpickle/jsonpickle我还没有使用它。这是一篇JSON与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)) 
相关问题