2010-12-12 9 views
1

CSV 파일 (크기 약 35MB)에서 많은 단어 목록 (2 백만 개 이상)이 있습니다. 인덱스 (기본 키)가있는 sqlite3에 CSV 파일을 가져 오려고했습니다. 그래서 sqlite 명령 줄 도구를 사용하여 가져 왔습니다. DB가 생성되었고 .sqlite 파일의 크기가 120MB 이상으로 커졌습니다! (기본 키 인덱스로 인해 50 %)응용 프로그램 내부에서 sqlite로 대량의 데이터를 가져 오는 방법 (실시간)

여기에서 우리는 문제가 발생합니다.이 120MB .sqlite 파일을 .ipa 파일로 압축 한 후에도 리소스에 추가하면 60MB를 초과합니다. 그리고 그것이 30MB보다 적 으면 좋겠다. (E/3G를 통한 제한 때문에).

또한 웹 서비스 (45MB * 1000 다운로드 = 45GB! 내 서버의 절반 년 제한)로 가져올 수없는 크기 (zip 형식의 sqlite 파일)이기도합니다. CSV 파일 ZIP과 이상의 단어 파일

  1. 압축 만 7메가바이트 파일이됩니다

    그래서 나는 같은 것을 할 수 있다고 생각.
  2. ZIP 파일을 리소스에 추가하십시오.
  3. 응용 프로그램에서 파일 압축을 풀고 압축 해제 된 CSV 파일의 데이터를 sqlite로 가져올 수 있습니다.

하지만 어떻게해야할지 모르겠다. 나는 이것을 시도했다 :

sqlite3_exec(sqlite3_database, ".import mydata.csv mytable", callback, 0, &errMsg); 

그러나 작동하지 않는다. 오류의 원인은 ".import"가 C API가 아닌 명령 줄 인터페이스의 일부이기 때문입니다.

그래서 압축 해제 된 CSV 파일을 SQLite 파일로 가져 오는 방법을 알아야합니다. (명령 행을 사용하여 develompent하는 동안에는 안됩니다.)

+0

이 무엇입니까? http://stackoverflow.com/questions/455606/how-to-import-file-into-sqlite – nacho4d

+0

nope. 나는 그것을 읽었다. 이 경우 내 질문에 대한 답변이 없습니다. 사이트 메모로 – konradowy

+0

예? 내가 맞습니까? – basarat

답변

0

가장 간단한 해결책은 NSScanner를 사용하여 CSV 파서를 작성하고 하나씩 데이터베이스에 행을 삽입하는 것입니다. 실제로는 매우 쉬운 작업입니다. 완벽한 CSV 파서 here을 찾을 수 있습니다.

+0

데이터베이스에 행을 2 개 이상 삽입하는 것이 좋은지 잘 모릅니다 ... – konradowy

+0

아니요, 아니며, 무리한 초기화 시간이 필요할 수 있습니다. 그러나 이것이 바로 명령 행 유틸리티가하는 일입니다. –

+1

아마존의 S3와 같은 클라우드 서비스에 파일을 저장하고 거기에서 앱을 다운로드하도록 고려 했습니까?많은 다운로드 (1GB는 단지 $ 0.15 정도입니다.)라고해도 상당히 저렴합니다. –

2

삽입하려는 단어가 고유하면 텍스트를 기본 키로 만들 수 있습니다.

단어가 집합에 있는지 (예 : 맞춤법 검사기) 테스트하려는 경우 블룸 필터와 같은 대체 데이터 구조를 사용할 수 있습니다.이 구조는 각 단어에 대해 1 % 오 탐지 만있는 9.6 비트 만 필요합니다 .

http://en.wikipedia.org/wiki/Bloom_filter

+0

나는 전체 데이터가 필요하지만, 미래에는 어쨌든 좋은 생각이다. – konradowy

1

으로 FlightOfStairs는 요구 사항에 따라 꽃의 필터를 사용하면 전체 데이터를 필요로하는 경우 다른 솔루션은 trie 또는 radix tree 데이터 구조를 사용하는 것입니다, 하나 개의 솔루션입니다 언급했다. 데이터를 사전 처리하고 이러한 데이터 구조를 작성한 다음 sqlite 또는 다른 외부 데이터 형식으로 저장하십시오.

관련 문제