Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何有效地进行批量索引查找?_Python_Google App Engine_Indexing_Scalability - Fatal编程技术网

Python 如何有效地进行批量索引查找?

Python 如何有效地进行批量索引查找?,python,google-app-engine,indexing,scalability,Python,Google App Engine,Indexing,Scalability,我有以下几种: 分子 原子 分子原子 给定一个长度为数百的列表(molecular\u id),我需要得到一个形式为{molecular\u id:list(atom\u id)}的dict。同样,给定一个长度为一百的list(atom\u id),我需要得到一个形式为{atom\u id:list(molecular\u id)}的dict 这两种批量查找都需要非常快地进行。现在我正在做一些类似的事情: atom_ids_by_molecule_id = {} for molecule_

我有以下几种:

  • 分子
  • 原子
  • 分子原子
给定一个长度为数百的
列表(molecular\u id)
,我需要得到一个形式为
{molecular\u id:list(atom\u id)}
的dict。同样,给定一个长度为一百的
list(atom\u id)
,我需要得到一个形式为
{atom\u id:list(molecular\u id)}
的dict

这两种批量查找都需要非常快地进行。现在我正在做一些类似的事情:

atom_ids_by_molecule_id = {}

for molecule_id in molecule_ids:
    moleculeatoms = MoleculeAtom.all().filter('molecule =', db.Key.from_path('molecule', molecule_id)).fetch(1000)
    atom_ids_by_molecule_id[molecule_id] = [
        MoleculeAtom.atom.get_value_for_datastore(ma).id() for ma in moleculeatoms
    ]
就像我说的,
len(分子id)
有数百种。我需要对几乎每一个请求进行这种批量索引查找,我需要它速度快,而现在它太慢了

想法:

  • 使用
    molecular.atoms
    ListProperty
    能满足我的需要吗?考虑到我在分子原子节点上存储了额外的数据,并且记住在分子中进行查找同样重要。->原子和原子>分子方向。

  • 缓存?我试着用memcaching列出由molecular ID键控的原子ID,但是我有大量的原子和分子,而缓存不能满足它

  • 如何通过创建一个新的实体类来对数据进行非规范化,该实体类的键名是分子ID,其值是原子ID列表?这个想法是,在500个键上调用
    db.get
    可能比使用过滤器循环500个回迁要快,对吗

一般来说,您的第三种方法(数据非规范化)是正确的。特别是,
db.get
by key确实与数据存储的速度差不多


当然,您也需要以另一种方式进行非规范化(具有关键字名称atom ID的实体,为分子ID列表赋值),并且当原子或分子被更改、添加或删除时,您需要小心地更新所有内容——如果您需要事务性的话(同时可能会进行多个这样的修改)你需要安排祖先关系。。但我看不出如何同时对分子和原子做到这一点,所以这可能是个问题。也许,如果修改足够少(并且取决于应用程序的其他方面),您可以在队列任务中序列化修改。

这听起来很像是一个问题,使用数据库(使用非规范化数据)最有效。因为它可以更好地扩展,而且数据库天生就是为了以最高效的方式处理这样的数据集连接而设计的。