みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

SQLite3の未経験者です。SQLite3に60億件のデータを登録し、あるカラムの値がユニークなものを抽出したいと考えています。
2つ疑問点があります。
1)SQLite3で60億件のデータを登録することは可能でしょうか?登録する予定のデータはテキストファイルで合計約900GBあります。カラム数は10個程度の予定です。
2)60億件のデータをメモリに展開することはできませんが、その場合でも、ユニークな値をとりだすことはできますか?可能な場合、どのくらいの時間がかかりますか?(1日で終わるのか何日もかかるのか)

実行させる環境は、144GBのメモリーの使えるLinuxのクラスターコンピュータです。

投稿日時 - 2015-03-26 07:18:39

QNo.8943090

Myc

すぐに回答ほしいです

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

なかなか厄介な量ですね。
以前試験的にではありますが、約1億件のデータを登録したことがあります。
1件あたり数十バイト程度のデータでしたが、このレベルになると使いにくいなという印象です。
重複データがかなりあり、重複を除くと100万件程度のものです。(同じ値が100件ずつ程度ある)

インデックスを作らずに書きこむとそんなに時間はかからなかったですが、全部書き込んだあとインデクスをつくりだすと半日くらいはかかったと思います。印象としては重複が多いデータほど時間がかかるようです。
一度1億件程度で試されてはいかがでしょうか。
SQlite3は読み出すのは結構速いです。上の場合で数十ms程度で検索可能でした。

それよりもハッシュテーブルのように、抽出したいカラムのハッシュ値(同じデータは同じ値を返すならなんでもよい)を計算して、それに基づいて別々のファイルに分割してデータサイズをメモリに入る程度に小さくする。同じデータは必ず同じファイルに入るので、分割したファイル単位で操作できます。

投稿日時 - 2015-03-26 17:54:10

お礼

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

投稿日時 - 2015-03-28 00:36:28

ANo.2

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

No.2です。

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

ハッシュ値の同じものは必ず同じファイルに必ず入っていますので、そのファイルを1つずつ順番に処理していけば良いわけです。他のファイルには同じ値のデータが入っていないことが保証できます。

投稿日時 - 2015-03-28 09:44:58

お礼

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

投稿日時 - 2015-03-28 10:04:38

ANo.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?)の性能に依存するため、一概になんとも言えません。

投稿日時 - 2015-03-26 15:14:45

お礼

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

投稿日時 - 2015-03-27 23:43:37

あなたにオススメの質問