2014-10-03 6 views
4

Apple은 최근 iOS8 Safari와 Safari 7.1에서 모두 indexeddb를 지원합니다. indexeddb에 약 65,000 개의 레코드를 저장하고 일부 복합 인덱스를 사용하여 쿼리하는 웹 응용 프로그램에서이를 사용하려고합니다.Safari에서 indexeddb를 매우 느리게 구현합니다.

저에게 효과적이지만 Chrome의 indexeddb 구현과 비교하면 정말 느립니다.

구체적으로 말하자면 ... Chrome의 indexeddb에 대해 2ms 걸린 쿼리는 Apple의 indexedbb에 대해 500ms가 걸립니다. 이 특정 쿼리는 IDBKeyRange.only 값을 사용하여 복합 indexeddb 인덱스 (키의 2 개 필드)를 사용하여 총 65,000 개의 문서를 약 100 개 다시 가져옵니다.

내 응용 프로그램은 저장 메커니즘으로 websql도 지원하며 Safari에서 전환 할 때 성능이 뛰어납니다. 내 쿼리는 Chrome과 마찬가지로 몇 밀리 초 안에 반환됩니다.

다른 사람이 Apple의 indexeddb 구현이 느린 데 문제가 있습니까? 더 잘 작동하도록하는 방법에 대한 제안이나 애플이 고칠 때까지 기다려야합니까?

나는 애플의 indexeddb 구현이 실제로 websql 위에있는 래퍼이며 좋은 성능을 가진 websql을 직접 사용하여 내 애플 리케이션을 구현할 수 있다는 사실은 그러한 래퍼가 잘 구현되면 잘 수행되어야한다는 것을 암시한다. 슬프게도, 그것은 아직 사실이 아니다!

+1

업데이트 ... Safari 9가 포함 된 iOS9 베타를 설치했으며 indexeddb가 수정되었습니다. 성능이 좋고 키 및 기타 버그로 인한 문제가 사라졌습니다. 1.5GB의 json 문서를 테스트했는데 모든 것이 잘되었습니다. 또한 50MB의 데이터 크기 제한이 없어졌으며 사용자에게 데이터 저장에 대한 메시지가 표시되지 않습니다. – Category6

+0

업데이트 2. 너무 빨리 말했습니다. iOS9 indexeddb는 50MB 제한이 사라지고 몇 가지 버그가 수정 되었기 때문에 조금 좋아졌지만 몇 천 개가 넘는 문서를 가지고 있으면 성능이 여전히 좋지 않습니다. 인덱스 쿼리에 대한 응답 시간이 5 초 이상입니다. 문서가 몇 개 이상 있으면 사용할 수 없습니다. – Category6

답변

2

우리는 똑같은 것을 보았습니다. 10000 개의 객체를 삽입하는 프로세스는 Android에서 완료하는 데 약 5 ~ 6 초, iOS8에서 15 분 정도 소요됩니다. 그것은이 같은 코드베이스를 사용하는 경우되도록

사파리 웹킷 브라우저 :

https://github.com/WebKit/webkit/blob/master/Source/WebKit2/DatabaseProcess/IndexedDB

다음 색인화는 SQLLite 데이터베이스를 기반 (나쁘게)이다.

+0

Firefox indexeddb 구현은 경례에 기반하지만 좋은 성능입니다. –

0

나는 또한 그 문제가있었습니다. 그러나 테이블이 커질수록 느려지는 것을 발견했습니다. 약 30,000 개의 레코드를 저장할 필요가 있었는데 서버에서 약 2,000 개를 가져 와서 삽입했습니다. 삽입 할 때까지 80 분 이상이 걸릴 때까지 각 일괄 처리 삽입물은 이전 것보다 느립니다. 우리가 생각해 보았던 해결책은 (그리고 엄청나게 못생긴) 각 동기화 부분에 대해 별도의 객체 저장소를 만드는 것입니다. 그런 다음 여러 객체 저장소/등을 쿼리해야합니다. 그러나 그것을 사용할 수 있도록 만들었습니다.

apple get의 indexeddb 구현이 분류 될 때까지 이것이 내가 가진 최상의 해결책이었습니다.

+0

관심 밖, 우리는 비슷한 타이밍 문제를 치고 있습니다. 얼마나 많은 (약) 객체 저장소가 생성을 완료 했습니까? –

+0

동적 인 것으로 설정 했으므로 저장소 당 최대 2000 개의 레코드가있는 것으로 생각하고 다음 레코드로 이동합니다. 이들은 id에 의해 서버에서 질의 된 다음 자신의 객체 저장소에 삽입됩니다.g select * 여기서 id> 0 AND id <2000; –

+0

그래서 저는 지금 우리가 사용하고있는 생산 데이터가있는 16 개의 객체 저장소를 생성하고 있다고 생각합니다. 각 ID에 대해 모든 레코드가 존재/활성 상태인지 여부에 따라 객체 저장소 중 일부는 다른 것으로 완전히 채워지는 1500에 가깝습니다. –