My Python High Replication Datastore 애플리케이션에는 100,000 ~ 1,000,000 개의 항목으로 구성된 큰 조회 테이블이 필요합니다. 해당 코드와 관련된 값을 반환하는 메서드에 대한 코드를 제공 할 수 있어야합니다 (연결이없는 경우 없음). 예를 들어, 내 테이블에 받아 들일 수있는 영어 단어가 있다면 그 단어가 발견되면 True를, 그렇지 않으면 False (또는 None)를 반환하는 함수를 원할 것입니다.GAE 조회 테이블이 거래와 호환되지 않습니까?
현재 나의 구현은 각 테이블 엔트리에 대해 하나의 부모없는 엔티티를 만들고 해당 엔티티에 관련 데이터를 포함하는 것입니다. 해당 엔티티의 데이터 저장소 키를 내 조회 코드와 동일하게 설정했습니다. (모든 엔티티를 키 충돌을 막기 위해 자체 네임 스페이스에 넣었지만이 질문에는 반드시 필요한 것은 아닙니다.) 그런 다음 코드에서 get_by_key_name()을 호출하고 관련 데이터를 가져옵니다.
문제는 엔티티 그룹에 걸쳐 있기 때문에 트랜잭션 중에 이러한 엔티티에 액세스 할 수 없다는 것입니다. 그래서 다시 나의 예를 들자면, 채팅 세션에서 사용 된 모든 단어를 맞춤법 검사하고 싶다고합시다. 공통 조상을 제공하기 때문에 채팅의 모든 메시지에 액세스 할 수 있었지만 항목이 상위가 없기 때문에 내 워드 테이블에 액세스 할 수 없었습니다. 거래 중에 테이블을 참조 할 수 있어야합니다.
내 조회 테이블은 고정되어 있거나 거의 변경되지 않습니다. 다시 이것은 맞춤법 검사 예제와 일치합니다.
한 가지 해결책은 한 트랜잭션 동안 채팅 세션에서 모든 단어를로드 한 다음 결과를 저장하고 맞춤법 검사 한 다음 저장된 결과에 대해 철자 검사를 수행하는 두 번째 트랜잭션을 시작하는 것입니다. 그러나 이것이 비효율적 일뿐만 아니라 채팅 세션이 트랜잭션 사이에 추가되었을 수도 있습니다. 이것은 서투른 해결책처럼 보입니다.
이상적으로 GAE에 조회 테이블을 변경할 수 없다고 말하고 싶습니다.이 때문에 트랜잭션의 스패닝 엔티티 그룹에 대해 불평하지 않고 조회 할 수 있어야합니다. 그러나 나는 이것을 할 어떤 방법을 보지 못했다.
memcache에 테이블 항목을 저장하는 것은 유혹이지만 그 역시 문제가 있습니다. 그것은 많은 양의 데이터이지만, GAE가 Memcache 항목을 부팅하면 트랜잭션 중에 다시로드 할 수 없다는 점이 더욱 까다 롭습니다.
큰 글로벌 검색 테이블에 적합한 구현을 아는 사람이 있습니까?
맞춤법 검사 웹 서비스 또는 그와 비슷한 서비스를 찾고 있지 않다는 것을 이해하십시오. 나는이 질문을 명확하게하기 위해 단어 룩업만을 예제로 사용하고 있으며 어떤 종류의 대형 룩업 테이블에 대한 일반적인 해결책을 기대하고있다.
+1을 메모리에 두는 것이 좋습니다. 고정 데이터의 경우 이것이 최적 일 수 있습니다. – SingleNegationElimination
첫 번째 제안에 관해서는, 트랜잭션을 시작하기 전에 데이터 스토어에 테이블을 유지 한 다음 전체 테이블을 인스턴스 메모리로 읽을 수 있다고 올바르게 이해합니까? 그게 효과가 있지만, 테이블은 3MB와 같은 것을 차지하고 테이블 조회 만하면됩니다. 따라서 필자가 요구하는 모든 파일이 수 백 바이트에 불과하므로 비효율적이라고 생각하면 3MB를 읽어야합니다. 아니면 다른 것을 제안하고 있습니까?인스턴스 메모리가 요청을 견딜 수있는 방법이 없습니다 (memcache에 쓰기를 제외하고). (그리고 일요일 밤에 회신 해 주셔서 감사합니다.) – Dragonfly
다른 아이디어에 대해서는 "개정 속성"아이디어를 이해하고 그에 따라 갈 수 있습니다. 아직 블롭 스토어 나 백엔드에 대해 배웠으므로 다음에 연구 할 것입니다. 나는 백엔드를 사용하는 소리를 좋아한다. 그 해결책에 어떤 단점이 있습니까? 추신 나는 여전히 GAE가 모든 트랜잭션에 의해 액세스 할 수있는 불변의 데이터 저장소 엔티티를 지원하는 것이 좋은 생각이라고 생각합니다! – Dragonfly