java - 检查谷歌应用引擎数据存储区中是否存在实体。




google-app-engine entity google-cloud-datastore (4)

检查实体是否存在于Google-app-engine数据存储区中的最佳/最快方法是什么? 现在我试图通过键获取实体并检查get()是否返回错误。

我不知道在数据存储区上获取实体的过程。 有没有更快的方法只做这个检查?


Answers

你提出的建议确实是了解你的实体是否存在的最快方法。 减慢速度的唯一因素是获取和反序列化实体所需的时间。 如果您的实体很大,这可能会让您失望。

如果此操作(检查是否存在)是您的主要瓶颈并且您拥有大型实体,则可能需要使用两个实体来推送自己的检查系统 - 首先是您的现有实体包含数据,第二个实体是或者存储对真实实体的引用,或者可能是一个空实体,其中键只是您可以计算的原始实体键的变体。 您可以使用第二个实体快速检查是否存在,然后仅在需要数据时才获取第一个实体。

我认为更好的方法就是设计你的密钥,你知道它们不会重复,或者你的操作是幂等的,这样即使旧的实体被覆盖,也没关系。


您可以使用仅包含一个KeyList<Key>获取, 该方法返回Map<Key, Entity> ,您可以检查它是否包含实际值或null ,例如:

Entity e = datastoreService.get(Arrays.asList(key)).get(key);

一般来说,虽然我认为在try / catch中包装get()更容易,如果捕获到EntityNotFoundException则返回null


com.google.appengine.api已被弃用,转而使用App Engine GCS客户端。

你考虑过使用查询吗? 猜测和检查不是一种可扩展的方法来查找数据存储中存在的实体。 可以创建查询以从数据存储中检索满足指定条件集的实体:

https://developers.google.com/appengine/docs/java/datastore/queries

编辑:

那么只有密钥的查询呢? 仅键查询比返回完整实体的查询运行得更快。 要仅返回键,请使用Query.setKeysOnly()方法。

new Query("Kind").addFilter(Entity.KEY_RESERVED_PROPERTY, FilterOperator.EQUAL, key).setKeysOnly();

资料来源:[1]: http://groups.google.com/group/google-appengine-java/browse_thread/thread/b1d1bb69f0635d46/0e2ba938fad3a543?pli=1http://groups.google.com/group/google-appengine-java/browse_thread/thread/b1d1bb69f0635d46/0e2ba938fad3a543?pli=1 1


This a rework from decimal to binary of the old Marchant calculator algorithm (sorry, I don't have a reference), in Ruby, adapted specifically for this question:

def isexactsqrt(v)
    value = v.abs
    residue = value
    root = 0
    onebit = 1
    onebit <<= 8 while (onebit < residue)
    onebit >>= 2 while (onebit > residue)
    while (onebit > 0)
        x = root + onebit
        if (residue >= x) then
            residue -= x
            root = x + onebit
        end
        root >>= 1
        onebit >>= 2
    end
    return (residue == 0)
end

Here's a workup of something similar (please don't vote me down for coding style/smells or clunky O/O - it's the algorithm that counts, and C++ is not my home language). In this case, we're looking for residue == 0:

#include <iostream>  

using namespace std;  
typedef unsigned long long int llint;

class ISqrt {           // Integer Square Root
    llint value;        // Integer whose square root is required
    llint root;         // Result: floor(sqrt(value))
    llint residue;      // Result: value-root*root
    llint onebit, x;    // Working bit, working value

public:

    ISqrt(llint v = 2) {    // Constructor
        Root(v);            // Take the root 
    };

    llint Root(llint r) {   // Resets and calculates new square root
        value = r;          // Store input
        residue = value;    // Initialise for subtracting down
        root = 0;           // Clear root accumulator

        onebit = 1;                 // Calculate start value of counter
        onebit <<= (8*sizeof(llint)-2);         // Set up counter bit as greatest odd power of 2 
        while (onebit > residue) {onebit >>= 2; };  // Shift down until just < value

        while (onebit > 0) {
            x = root ^ onebit;          // Will check root+1bit (root bit corresponding to onebit is always zero)
            if (residue >= x) {         // Room to subtract?
                residue -= x;           // Yes - deduct from residue
                root = x + onebit;      // and step root
            };
            root >>= 1;
            onebit >>= 2;
        };
        return root;                    
    };
    llint Residue() {           // Returns residue from last calculation
        return residue;                 
    };
};

int main() {
    llint big, i, q, r, v, delta;
    big = 0; big = (big-1);         // Kludge for "big number"
    ISqrt b;                            // Make q sqrt generator
    for ( i = big; i > 0 ; i /= 7 ) {   // for several numbers
        q = b.Root(i);                  // Get the square root
        r = b.Residue();                // Get the residue
        v = q*q+r;                      // Recalc original value
        delta = v-i;                    // And diff, hopefully 0
        cout << i << ": " << q << " ++ " << r << " V: " << v << " Delta: " << delta << "\n";
    };
    return 0;
};




java google-app-engine entity google-cloud-datastore