2017-04-19 7 views
1

大量のデータを格納するのにSQliteを使用していますが、非常に単純なクエリを使用してそのデータを抽出する際に問題があります。現時点では、私のデータベースは1つのテーブルにすぎず、約50millionの行と15の列があります。私はこの表から完全な1列を抽出したいと思います。大規模なSQLiteデータベースから効率的にデータを抽出するにはどうすればよいですか?

私はRSQliteを使ってみました:dbGetQuery(db, ‘select qs from CSI’)qsCSIはそれぞれ私の列とテーブル名です。 Qは文字列です。このクエリは、何時間も前から実行しています(Rバージョン3.3.3、RSQLite_1.1-2)。

また、同じクエリを使用してSQLite(v3.9.1)用のDBブラウザを試してみましたが、数時間の実行時間後に再び諦めました。 IDKey /索引付けはありませんが、列全体が必要なので、これは影響がないはずです。

私は16GB RAMを搭載した64ビットWindowsマシンで動作しています。妥当な時間内にテーブルから列を抽出するにはどうすればよいですか?それとも、データに簡単にアクセスできるようにデータを保存するのが良い方法はありますか?

+1

私は同様の問題を抱え、 'SQLite'の代わりに' MonetDBLite'(https://www.monetdb.org/blog/monetdblite-r)を使い始めました。 (MonetDBはカラムオーリエントストレージを使用しますが、SQLiteはロー指向ストレージを使用します) –

+0

@docendoありがとう、MonetDBLiteに行きましょう。私のRSQLiteテーブルをMonetDBLiteに直接インポートするには良い方法がありますか?それらを作成するのはかなり時間がかかりましたので、もう一度やり直す必要はありません。乾杯。 – nm200

+0

正しく覚えていれば、私はsqliteデータベースのCSVエクスポートを作成し、それをmonetdblite dbにロードしました –

答えて

2

カラム値を取得するには、SQLiteはそのカラムまでのローを読み込む必要があります。したがって、すべての行から値を取得するには、実際にすべてを読み取る必要があります。

この列のインデックスを使用すると、ディスクから読み取るデータの量を減らすcovering indexになります。

実際に同じ行から複数​​の値を必要としない場合は、異なるテーブルに列を格納するか、別のデータベースを使用することを検討してください。

+0

CLに感謝します。 – nm200

関連する問題