14

Slick を使用して、非常に大きなテーブルからすべてのレコードを取得できるようにしたいと考えています。foreach、for、または list fetching を使用してこれを実行しようとすると、メモリ不足の例外が発生します。

必要なときにのみオブジェクトをフェッチして、使用するメモリの量を減らす Slick または遅延読み込みで「カーソル」を使用する方法はありますか?

4

3 に答える 3

5

カーソルの意味はわかりませんが、ページネーションを使用して部分的なデータをフェッチできます。

query.drop(0).take(1000) will take the first 1000 records

query.drop(1000).take(1000) will take from 1001 to 2000 lines of the table.

ただし、このクエリの効率は、データベースがサポートされているかどうか、テーブルに適切なインデックスが付けられているかどうかによって異なります。

于 2013-01-17T17:24:13.267 に答える
1

iteratorイテレータを返す組み合わせを使用できます。

 val object = Objects.where(...).map(w => w).iterator()

および groupby:

val chunkSize = 1000
val groupedObjects = objects.grouped(chunkSize)
groupedObjects.foreach {objects => objects.par.map(h => doJob(h))}

この回答で示唆されているように

于 2013-08-03T13:40:14.310 に答える
0

dirceusemighini の答えは正しいです。Query.list() に関する間違った仮定が原因で、数日前に同様の問題に遭遇したため、さらにコンテキストを提供できます。スリックリファレンスから:

「クエリは、Invoker トレイト (またはパラメーターなしのバージョンの場合は UnitInvoker) で定義されたメソッドを使用して実行されます。クエリからの暗黙的な変換があるため、任意のクエリを直接実行できます。最も一般的な使用シナリオは、完全な結果セットを strict に読み込むことです。リストなどの特殊なメソッドを持つコレクション、またはあらゆる種類のコレクションを構築できるジェネリック メソッド」

Query.list() が完全な結果セットをメモリにロードすることは確かに真実です。これを念頭に置いて、問題に対して複数のアプローチを取ることができます。

于 2015-05-17T20:26:32.520 に答える