4

これは、ここでの使用に関する回答のフォローアップですsqldf()

https://stackoverflow.com/a/1820610

私の特定のケースでは、1 億 1000 万行を超えるタブ区切りファイルがあります。460 万のタグ ID に一致する行を選択したいと考えています。

次のコードでは、タグ ID はtag.query

ただし、この例は小さなクエリで機能しますが、上記の大きな例は処理しません。

sql.query <- paste('select * from f where v2 in (', tag.query, ')', sep='')
selected.df <- sqldf(sql.query, dbname = tempfile(), file.format = list(header = F, row.names = F, sep="\t", skip=line.where.header.is))

代替アプローチに関する提案はありますか?

4

2 に答える 2

3

問題が速度である場合は、 にインデックスを作成してみてくださいv2sqldf ホーム ページの例 4i を参照してください。それでも十分に高速でない場合は、別のデータベースを使用することもできます。デフォルトの SQLite だけでなく、sqldf は H2、MySQL、および PostgreSQL をサポートしています。

于 2012-03-19T20:07:34.320 に答える
1

前述のように、実際にテーブルにインデックスを付ける必要があります。しかし、データベースSQLiteは、1,000万を超えるレコードを含むインデックスの構築に成功せず、非常に遅くなります。4,000万件のレコードを試してみましたが、フリーズします。BigTableのCREATEINDEXで他のデータベースがどのように機能するかわかりません。

同じ問題が発生し、テーブルをタグIDで並べ替えて、テキストファイルに書き込むことになりました。次に、テキストファイルでタグIDを直接検索するバイナリ検索をC++で記述しました。二分探索はgrep検索のO(log N)対O(N)であり、Nは数千万であるため、実行が大幅に高速化されました。必要に応じて共有できます。

于 2012-03-19T21:22:23.723 に答える