0

My Python High Replication Datastore 애플리케이션에는 100,000 ~ 1,000,000 개의 항목으로 구성된 큰 조회 테이블이 필요합니다. 해당 코드와 관련된 값을 반환하는 메서드에 대한 코드를 제공 할 수 있어야합니다 (연결이없는 경우 없음). 예를 들어, 내 테이블에 받아 들일 수있는 영어 단어가 있다면 그 단어가 발견되면 True를, 그렇지 않으면 False (또는 None)를 반환하는 함수를 원할 것입니다.GAE 조회 테이블이 거래와 호환되지 않습니까?

현재 나의 구현은 각 테이블 엔트리에 대해 하나의 부모없는 엔티티를 만들고 해당 엔티티에 관련 데이터를 포함하는 것입니다. 해당 엔티티의 데이터 저장소 키를 내 조회 코드와 동일하게 설정했습니다. (모든 엔티티를 키 충돌을 막기 위해 자체 네임 스페이스에 넣었지만이 질문에는 반드시 필요한 것은 아닙니다.) 그런 다음 코드에서 get_by_key_name()을 호출하고 관련 데이터를 가져옵니다.

문제는 엔티티 그룹에 걸쳐 있기 때문에 트랜잭션 중에 이러한 엔티티에 액세스 할 수 없다는 것입니다. 그래서 다시 나의 예를 들자면, 채팅 세션에서 사용 된 모든 단어를 맞춤법 검사하고 싶다고합시다. 공통 조상을 제공하기 때문에 채팅의 모든 메시지에 액세스 할 수 있었지만 항목이 상위가 없기 때문에 내 워드 테이블에 액세스 할 수 없었습니다. 거래 중에 테이블을 참조 할 수 있어야합니다.

내 조회 테이블은 고정되어 있거나 거의 변경되지 않습니다. 다시 이것은 맞춤법 검사 예제와 일치합니다.

한 가지 해결책은 한 트랜잭션 동안 채팅 세션에서 모든 단어를로드 한 다음 결과를 저장하고 맞춤법 검사 한 다음 저장된 결과에 대해 철자 검사를 수행하는 두 번째 트랜잭션을 시작하는 것입니다. 그러나 이것이 비효율적 일뿐만 아니라 채팅 세션이 트랜잭션 사이에 추가되었을 수도 있습니다. 이것은 서투른 해결책처럼 보입니다.

이상적으로 GAE에 조회 테이블을 변경할 수 없다고 말하고 싶습니다.이 때문에 트랜잭션의 스패닝 엔티티 그룹에 대해 불평하지 않고 조회 할 수 있어야합니다. 그러나 나는 이것을 할 어떤 방법을 보지 못했다.

memcache에 테이블 항목을 저장하는 것은 유혹이지만 그 역시 문제가 있습니다. 그것은 많은 양의 데이터이지만, GAE가 Memcache 항목을 부팅하면 트랜잭션 중에 다시로드 할 수 없다는 점이 더욱 까다 롭습니다.

큰 글로벌 검색 테이블에 적합한 구현을 아는 사람이 있습니까?

맞춤법 검사 웹 서비스 또는 그와 비슷한 서비스를 찾고 있지 않다는 것을 이해하십시오. 나는이 질문을 명확하게하기 위해 단어 룩업만을 예제로 사용하고 있으며 어떤 종류의 대형 룩업 테이블에 대한 일반적인 해결책을 기대하고있다.

답변

1

가능한 경우 데이터를 인스턴스 메모리에 저장하십시오.인스턴스 메모리에 맞지 않으면 몇 가지 옵션을 사용할 수 있습니다.

자주 변경되지 않는 경우 데이터를 앱과 함께 업로드 한 리소스 파일에 저장할 수 있으며 디스크에서 액세스 할 수 있습니다. 이것은 쉽게 디스크 검색을 가능하게하는 데이터 구조를 구축 할 수 있다고 가정합니다. 효과적으로, 독자적인 읽기 전용 디스크 기반 테이블을 구현하는 것입니다.

마찬가지로 정적 리소스로 적합하기에 너무 큰 경우 위와 동일한 방식을 취할 수 있지만 데이터를 blobstore에 저장합니다.

데이터가 절대적으로 데이터 저장소에 있어야하는 경우 자신의 읽기 - 수정 - 쓰기 트랜잭션을 에뮬레이션해야 할 수 있습니다. 레코드에 'revision'속성을 추가하십시오. 이를 수정하려면 (트랜잭션 외부의) 레코드를 가져 와서 필요한 변경을 수행 한 다음 트랜잭션 내에서 다시 가져 와서 개정 값을 확인하십시오. 변경되지 않은 경우, 사용자 자신의 레코드에 대한 개정을 증가시키고이를 데이터 스토어에 저장하십시오.

원칙적으로 기본 RPC 계층은 이론적으로 여러 개의 독립적 인 트랜잭션 (및 비 트랜잭션 연산)을 지원하지만 API는 현재 트랜잭션 내에서 액세스 할 수있는 방법을 제공하지 않습니다. 끔찍한) 해킹, 불행히도.

최종 옵션 하나 : 더 많은 메모리가 프로 비전 된 백엔드를 실행하고 'SpellCheckService'를 노출하고 프론트 엔드에서 URLFetch 호출을 수행 할 수 있습니다. 인 메모리는 항상 디스크 기반 옵션보다 훨씬 더 빠르다는 것을 기억하십시오.

+0

+1을 메모리에 두는 것이 좋습니다. 고정 데이터의 경우 이것이 최적 일 수 있습니다. – SingleNegationElimination

+0

첫 번째 제안에 관해서는, 트랜잭션을 시작하기 전에 데이터 스토어에 테이블을 유지 한 다음 전체 테이블을 인스턴스 메모리로 읽을 수 있다고 올바르게 이해합니까? 그게 효과가 있지만, 테이블은 3MB와 같은 것을 차지하고 테이블 조회 만하면됩니다. 따라서 필자가 요구하는 모든 파일이 수 백 바이트에 불과하므로 비효율적이라고 생각하면 3MB를 읽어야합니다. 아니면 다른 것을 제안하고 있습니까?인스턴스 메모리가 요청을 견딜 수있는 방법이 없습니다 (memcache에 쓰기를 제외하고). (그리고 일요일 밤에 회신 해 주셔서 감사합니다.) – Dragonfly

+0

다른 아이디어에 대해서는 "개정 속성"아이디어를 이해하고 그에 따라 갈 수 있습니다. 아직 블롭 스토어 나 백엔드에 대해 배웠으므로 다음에 연구 할 것입니다. 나는 백엔드를 사용하는 소리를 좋아한다. 그 해결책에 어떤 단점이 있습니까? 추신 나는 여전히 GAE가 모든 트랜잭션에 의해 액세스 할 수있는 불변의 데이터 저장소 엔티티를 지원하는 것이 좋은 생각이라고 생각합니다! – Dragonfly

1

첫 번째로 네임 스페이스가 주요 충돌을 피하는 데 도움이된다고 생각하는 경우 먼저 조치를 취해야합니다. 키는 엔터티 종류, 네임 스페이스, 이름 또는 ID 및 엔터티가 가질 수있는 부모로 구성됩니다. 두 개의 서로 다른 엔티티 종류가 동일한 이름 또는 ID를 갖는 것은 완전히 유효합니다. 예를 들어 LookupThingy이 일치하고 고유 한 이름을 지정하여 각 구성원을 만든 경우 키는 다른 것과 충돌하지 않습니다.

트랜잭션 내에서 부모가 아닌 조회 테이블에 해당하는 맞춤법 검사를 수행 할 때 코드에서 조회 테이블을 유지할 수 있습니까?

또는 당신이 필요로하는 것과 유사한 유추를 생각할 수 있습니까? 트랜잭션 내에서 조회를 수행해야하는 동기가 있습니까?

+0

예, 별도의 네임 스페이스로 보호 기능을 추가하지 않아도됩니다. 이것은 키 충돌을 피할 수 있다고 생각 했었지만, 기본 네임 스페이스 내에서도 적절하게 처리해야합니다. 다른 예 : 각 우편 번호에 데이터를 연결하려고한다고 가정 해보십시오. 예를 들어, 평균 수입 수치 또는 기타 인구 통계가있을 수 있습니다. 거래 내에서이 테이블을 어떻게 참조 할 수 있습니까? 이것은 매우 일반적인 문제처럼 보입니다. 백만 개의 항목이 파이썬 코드에 고정 배선되어 있습니까? 나는 그것이 효과가있을 것이라고 생각하지만, 그것은 꼴 사나운 것처럼 보인다. 그게 유일한 해결책입니까? – Dragonfly

+0

조회 테이블과의 일치가 트랜잭션과 함께 수행되어야하는 이유는 무엇입니까? 조회 테이블을 자주 변경하지 않으려 고 시도하고 있습니까? –

+0

여기에는 트랜잭션의 필요성을 충분히 설명 할 여유가 없지만 조회 테이블과는 아무런 관련이 없습니다. 이는 일반적인 이유입니다. 엔티티 그룹을 변경하려고하며 데이터를 원자 적으로 처리해야합니다. 필자는 파이썬에서 모든 테이블 데이터를 표현하는 실험을했는데, 이는 코드에 허용 된 공간 ("소프트 프로세스 크기 제한")을 초과했습니다. 나는 이것이 예상 된 것 같아요. 문제는 답이 없습니다. – Dragonfly

관련 문제