1

Postgresデータベースに大量のファイル(バイナリデータ)をロードしています(ファイルはdbにブロブとして保存されています)。

私が見つけた 1 つの方法は、うまく機能するラージ オブジェクトを使用することでした。ただし、さまざまな理由から、ファイルの内容を bytea フィールドに直接保存する可能性を探りたいと思います。現在、Large Object マネージャーを使用すると、バイトのチャンクをバッファーに直接書き込むことができるため、最初にファイル全体をメモリにロードする必要がなくなります。

これは、複数のスレッドが並行してファイルをロードしているため、私にとってはかなり重要です(すべてのスレッドが同時にファイル全体をメモリにロードしている場合、GC は追いつくことができません)。

bytea パラメータでこれを行う方法はありますか? 行のバイトフィールドにバイトのチャンクを追加する SQL 関数を考えていました。次に、ブロブに対してこの関数を繰り返し呼び出すことができます。私は PostgreSQL にかなり慣れていないので、そのような SQL 関数がどのように見えるかについてヒントを得ることができました。

では、PostgreSQL で bytea blob に追加するにはどうすればよいでしょうか?

ところで、別のアイデアも大歓迎です。

私は PostgreSQL 9.3、C# (.NET 4)、および NpgSql Postgres データ プロバイダーを使用しています。ファイル (ブロブ) は、数 kb から数 mb までのすべてのものにすることができます。

編集:関数への参照を見てきましたbyteacatが、有望に思えますが、使用方法の例が見つかりません。

Edit2:最終的には、ブロブをクエリで単一のパラメーターとしてロードするのが最も簡単なようです...ガベージコレクションが十分に高速であることを確認する限り(たとえば、バイト配列をプロパティにしないでください物体)。Postgresql はデータを非常にうまく処理します。

4

1 に答える 1

0

編集: Daniel Vérité の言うとおりです。これは面倒です (そして、しばらくすると大幅に遅くなります)。この方法はお勧めしません。

わかりました、それは本当に簡単でした:

|| があります。バイナリデータを追加する演算子... 例:

UPDATE TableWithBlob SET blob = blob || E'123\\000456' WHERE id = 'a356211f-1cb7-436d-80a8-7e608ffds0';

またはパラメーター化された SQL クエリとして (NpgSQL データ プロバイダーを使用する場合):

UPDATE TableWithBlob SET blob = blob || @Data WHERE ID = @ID;
于 2013-12-24T10:09:00.777 に答える