• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:SQLite3に登録できるデータ数の限界は?)

SQLite3に登録できるデータ数の限界は?

このQ&Aのポイント
  • SQLite3で60億件のデータを登録することは可能でしょうか?登録する予定のデータはテキストファイルで合計約900GBあります。
  • 60億件のデータをメモリに展開することはできませんが、ユニークな値を取り出すことはできますか?可能な場合、どのくらいの時間がかかりますか?
  • 実行させる環境は、144GBのメモリーの使えるLinuxのクラスターコンピュータです。

質問者が選んだベストアンサー

  • ベストアンサー
  • ki073
  • ベストアンサー率77% (491/634)
回答No.2

なかなか厄介な量ですね。 以前試験的にではありますが、約1億件のデータを登録したことがあります。 1件あたり数十バイト程度のデータでしたが、このレベルになると使いにくいなという印象です。 重複データがかなりあり、重複を除くと100万件程度のものです。(同じ値が100件ずつ程度ある) インデックスを作らずに書きこむとそんなに時間はかからなかったですが、全部書き込んだあとインデクスをつくりだすと半日くらいはかかったと思います。印象としては重複が多いデータほど時間がかかるようです。 一度1億件程度で試されてはいかがでしょうか。 SQlite3は読み出すのは結構速いです。上の場合で数十ms程度で検索可能でした。 それよりもハッシュテーブルのように、抽出したいカラムのハッシュ値(同じデータは同じ値を返すならなんでもよい)を計算して、それに基づいて別々のファイルに分割してデータサイズをメモリに入る程度に小さくする。同じデータは必ず同じファイルに入るので、分割したファイル単位で操作できます。

Myc
質問者

お礼

実際の経験のお話はとても参考になります。 インデックスの作成は時間がかかるけど、検索は比較的早いのですね。 後半部分で提示していただいた、ファイルを分割してはという提案内容ですが、補足説明をお願いできませんか? まず扱うデータについて補足します。60億件のデータには、とびとびに重複データが存在していて、重複は平均5件ぐらい含まれていると予測しています。したがって、ユニークな値は10億程だと思います。 疑問点が2つあります。 1.もし、ユニークな値でファイルを分割した場合、ファイル数が膨大なものになってしまいます。1個1個データベースを接続してデータを取得していくのは大変な手間なので、一気にすべてのデータベースに接続して、1つのデータベースを扱いようにSQL文を発行したいのですが、そのようなことは可能でしょうか? 2.この質問は、補足でなく別の質問として聞くべきかもしれません。抽出するカラムの値を数値に変換したものをハッシュテーブルに入れて、ユニークかどうかを判別する方法は、とても参考になりました。ただ、仮にperlでそれをした場合、ハッシュテーブルに10億の値をしまえるのか心配なのですが、大丈夫なものでしょうか?それとも、その10億の値をストックするためにも他のSQLite3のデータベースを使うということでしょうか?

その他の回答 (2)

  • ki073
  • ベストアンサー率77% (491/634)
回答No.3

No.2です。 データベース化するよりもメモリ上にのる程度にデータを分割して、連想配列などを使ってユニーク値を取り出す方が速いのではないかと予想しての提案です。 その分割方法ですが、ユニーク値を調べたいカラムのハッシュ値を計算して例えばハッシュ値の下一桁の値でそれに対応する別々のファイルに書き込みます。 同時に開くことができるファイル数に制限があるはずですので、この場合は10個のファイルに分割できます。 ハッシュ値の同じものは必ず同じファイルに必ず入っていますので、そのファイルを1つずつ順番に処理していけば良いわけです。他のファイルには同じ値のデータが入っていないことが保証できます。

Myc
質問者

お礼

ハッシュ値の値によってファイルに分割して格納するんですね。 とてもよく分かりました。 その方法を使えば、データベースを使わずに目的を達成できそうです。 ありがとうございました。

  • heburusu
  • ベストアンサー率85% (140/164)
回答No.1

>1)SQLite3で60億件のデータを登録することは可能でしょうか?登録する予定のデータはテキストファイルで合計約900GBあります。 >カラム数は10個程度の予定です。 SQLiteの仕様としては可能のようです。 (約140TBまで対応) http://www.sqlite.org/fileformat2.html また、SQLiteが対応していても、ファイルが置かれるファイルシステムも巨大なファイルを取り扱える必要があります。 例えば、ext3なら最大で2TiBまでのファイルしか作成できません。 http://ja.wikipedia.org/wiki/Ext3 >2)60億件のデータをメモリに展開することはできませんが、その場合でも、ユニークな値をとりだすことはできますか? >可能な場合、どのくらいの時間がかかりますか?(1日で終わるのか何日もかかるのか) 時間はかかるかもしれませんが、ユニークな値を取り出すことはできると思います。 メモリに全てのデータが載らない以上、データの読み出しは記憶装置(ハードディスク or SSD?)の性能に依存するため、一概になんとも言えません。

Myc
質問者

お礼

仕様上は可能ということですね。 有用な情報ありがとうございました。 試してみようと思います。

関連するQ&A