상황 : .Net 클라이언트 응용 프로그램 (C#, Mono)은 웹 서비스 (SOAP)에서 데이터를 다운로드하고이를 Sqlite DB에 저장합니다. DB 인터페이스는 Sqlite3.dll을 사용하는 System.Data.Sqlite입니다.System.Data.Sqlite (C#) vs. Sqlite (C) 성능
DB (130MB)에는 수십 개의 테이블이 있습니다. 하나의 테이블은 특히 크며 DB 크기의 90 %를 차지합니다 - 일부 BLOB 컬럼이있는 레코드는 10000 개입니다. (가장 큰 얼룩은 260K입니다.)
iPad에서 다운로드하는 데 22 분이 소요됩니다. DB에 실제 글을 주석 처리 할 때 약 11 분이 걸렸으므로 DB가 약 11 분 정도 걸리는 것처럼 보입니다. "DB"는 System.Data.Sqlite 위의 일부 레이어를 의미합니다. 세부 사항을 아직 모릅니다. 내가 아는 전부는 모든 DB 명령이 트랜잭션에 있고 단지 몇 가지 트랜잭션이 관련되어 있다는 것입니다. (트랜잭션은 문제가되지 않습니다.)
Sqlite 쉘을 사용하여 DB를 덤프하고 sqlite3_exec()를 덤프 된 문자열과 함께 호출하는 C 코드를 측정했을 때 (이 코드는 최적이 아닙니다), 50 초 (iPad). 그것은 sqlite C 코드가 DB를 매우 빠르게 생성 할 수 있음을 의미합니다.
또 다른 흥미로운 문제 : 다운로드는 테이블별로 구성되어 있습니다. 모든 테이블 (일부는 몇 MB가 있음)은 정상적으로 작동합니다. 한 번에 다운로드를 몇 가지 항목 (5 개)으로 재구성해야하는 가장 큰 테이블을 제외하고. 이 방법을 사용하지 않으면 다운로드가 실패하여 메모리가 부족합니다. 가장 가능성있는 설명은 메모리 단편화입니다. (모노는 GC에 문제가있어 좋은 메모리 정보를 제공하지 않습니다.)
내 생각에 다운로드 프로세스 자체가 문제의 더 작은 부분에 책임이 있습니다. 그것은 DB와 대략 동일한 크기를 다운로드합니다. 단편화가 문제가되어서는 안됩니다. 그러나 단일 스레드 조직은 대기 시간을 추가합니다.
그러나 가장 큰 문제는 애플리케이션의 데이터 처리입니다.
- 그것은 여러 프로토콜 (HTTP, SOAP, XML)
- 데이터 처리 System.Data.Sqlite 및 sqlite3.dll을 호출을 구문 분석 할 수있다. 할당, 마샬링 등이 포함됩니다.
나중에 더 많은 테스트를 수행 할 예정이지만, 지금은 아이디어를 요청하고 싶습니다. 예를 들어 System.Data.Sqlite와 원시 Sqlite의 성능 비교를 환영합니다. 아무도?
흠, 모든 거래에 엄청난 양의 행을 추가 하시겠습니까? 아니면 조금 더 나누시겠습니까? 거대한 트랜잭션을 사용하는 경우 트랜잭션 로깅이 문제가 될 수 있습니다. –
나는 그것에 대해 생각했다. 그러나 덤프 된 문자열을 사용하여 설명 된 테스트를 수행하십시오. 거기에있는 모든 것 (명령 1000 개, 덤프 문자열 자체는 약 130MB)은 단일 트랜잭션 내에 있습니다. 결과는 완벽합니다. –
죄송하지만, 나는 아무것도 얻지 못했습니다 :) 결코 모바일 플랫폼에서 sqlite로 크기가 조정 된 트랜잭션을 시도하지 않았습니다. –