2010-12-12 27 views
1

CSVファイル(サイズ約35MB)で大きなリストの単語(2百万以上)があります。 インデックス(プライマリキー)を使用してCSVファイルをsqlite3にインポートしたかったのです。 sqliteコマンドラインツールを使用してインポートしました。 DBが作成され、.sqliteファイルのサイズが120MB以上になりました! (プライマリキーインデックスのために50%)大量のデータをアプリケーション内のsqliteにインポートする方法(リアルタイム)

ここで私たちは問題が発生します。この120MBの.sqliteファイルを.ipaファイルに圧縮した後でもリソースに追加すると、> 60MBになります。そして、それが30MB未満になるとしたいと思います(E/3Gによる制限のため)。

また、サイズのため、Webサービス(45MB * 1000ダウンロード= 45GB!これは私のサーバーの半年の制限です)でインポートできません(zip形式のsqliteファイル)。

だから、私はこのような何かできると思っていた:

  1. ZIPにし、ファイルよりも言葉でCSVファイルのみ7メガバイトのファイルを持っています圧縮を。
  2. ZIPファイルをリソースに追加します。
  3. 私はファイルを解凍し、解凍したCSVファイルからsqliteにデータをインポートできます。

しかし、私はこれを行う方法がわかりません。私はこれをしようとしました:

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

しかし、それは動作しません。この失敗の理由は、 ".import"はコマンドラインインターフェイスの一部であり、C APIではありません。

だから私はそれを(圧縮されていないCSVファイル)をアプリケーション内のSQLiteファイルにインポートする方法を知っておく必要があります。

+0

これは関連していますか? http://stackoverflow.com/questions/455606/how-to-import-file-into-sqlite – nacho4d

+0

nope。私はそれを読んだ。この場合、私の質問に対する答えはありません。サイトメモとして – konradowy

+0

よろしいですか?私は正しい? – basarat

答えて

0

最も簡単な解決策は、NSScannerを使用してCSVパーサを作成し、その行を1つずつデータベースに挿入することです。これは実際にはかなり簡単な仕事です。完全なCSVパーサーhereを見つけることができます。

+0

2つ以上の行を1つずつデータベースに挿入することをお勧めしますか? – konradowy

+0

いいえ、そうではなく、不合理な量の初期化時間が必要です。しかし、それはまさにコマンドラインユーティリティが果たす役割です。 –

+1

Amazon S3のようなクラウドサービスにファイルを置いてアプリがそこからダウンロードできるようにしたことがありますか?それはあなたが多くのダウンロードを持っていても非常に安いでしょう(1GBはわずか0.15ドルです、私は信じています)。 –

2

挿入する単語が一意の場合は、そのテキストを主キーにすることができます。

単語がセット内に存在するかどうか(スペルチェッカーの場合など)をテストする場合は、ブルームフィルタなどの代替データ構造を使用できます。ただし、各単語には1ビットの偽陽性。

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

+0

私は完全なデータが必要ですが、これは将来的には良いアイデアです – konradowy

1

としてFlightOfStairsは、要件に応じて、ブルームフィルタを使用すると、完全なデータが必要な場合は、別の解決策は、trieまたはradix treeデータ構造を使用することで、一つの解決策である述べました。データを前処理してこれらのデータ構造を構築し、それをsqliteまたは他の外部データ形式に入れます。

関連する問題