10

1 日あたり約 2M のレコードが約 2G のメモリを消費する KDB/Q データベースがあります。一日の終わりに、テーブル間の結合を行い、結果をディスク上のファイルに出力するいくつかのレポート機能を実行します。計算中、メモリ使用量は 15G まで増加します。私の問題は、この操作が終了するとメモリが解放されず、DB が再起動されるまで 15G のメモリがすべて消費されることです。

KDB にいくつかのテーブルをメモリからアンロードするように指示したいのですが (削除はしません)、他のアプリがまだ接続しているため、DB を再起動したくありません。

KDB にメモリから何かをアンロードするように指示する方法はありますか?

編集:

誰かが興味を持っている場合は.Q.gc[]、KDB 2.5+ を調べてみることをお勧めします。有望に見えます。

4

4 に答える 4

10

これが私の研究の要約です:

  • バージョン以前のKDB。2.5 では、必要に応じて 64MB のメモリ チャンクが割り当てられ、解放されることはありません。ただし、それらを再利用することはできます。
  • 最近の KDB バージョン.Q.gc[]では、要求に応じてガベージ コレクターを呼び出すことができます (KDB は ref. counting を使用します)。
  • これは、大量のメモリ (私の場合は ~20GB) を割り当てるメモリ集約型の計算を呼び出し、計算が終了した後にメモリを解放したい場合に特に便利です。
  • スクリプトが終了するとメモリが解放されるように、メモリを集中的に使用するスクリプトを別の Q プロセスに配置することをいつでも検討できます。
于 2012-04-18T11:10:36.043 に答える
5

これは明らかかもしれませんが、qのバージョンのガベージコレクションモードをチェックすることに加えて、メモリを使用しているメモリ内データを実際に削除したことを確認してください。テーブル全体を削除しても問題がない場合(たとえば、これは計算に関係する一時テーブルです)、ルート名前空間から削除するだけです。

delete table from`.

そうでない場合は、そのすべての行を削除できます

delete from`table
于 2012-04-23T18:29:34.573 に答える
4

将来これを試みる人にとって、最も簡単な方法は次のとおりです。

  1. 新しい KDB プロセスを開始します。
  2. そのプロセス クエリから、必要なデータの最小の制限されたサブセットを選択します。
  3. そのプロセスから結合/計算/ファイルへの書き込みを実行します。(オリジナルが処理要求を続行できるようにする)
  4. プロセスを閉じて、すべてのメモリを解放します。

上記のポスターで述べたように、KDB の新しいバージョンはメモリを解放しますが、完全ではありません。

当社の Web サイトに、KDB+ メモリ管理について詳しく説明した優れた記事があります: http://timestored.com/kdbGuides/memoryManagement

于 2013-01-18T03:22:36.203 に答える