web-dev-qa-db-ja.com

Postgresの圧縮関数

Java&JDBCを使用して、PostgresのJSONB列に文字列を格納しています。挿入するとうまくいきます。

値を取得するとき、Javaでメモリが不足しています。大量のデータを取得しているため、各json/stringが約1MBです。次のようなクエリを記述します。

SELECT compress( myJsonColumn ) FROM myTable WHERE ...

Postgresで圧縮メソッドを探してみましたが、見つかりませんでした。どんなポインタでもいただければ幸いです。ありがとう。

明確化:明確にするために、データベース内のデータを圧縮したくありません。私はPostgresがこれを適切に処理するだろうと思います、私の懸念は主にJava-heap-spaceです。

私のアーキテクチャには3つのコンポーネントがあります。

  1. 非圧縮jsonを必要とするクライアント(および非圧縮を自分で処理するクライアント)
  2. 複数のクライアントにサービスを提供するサービス。サービスのメモリを保護しようとしています。サービスは、圧縮されていないjsonを確認する必要はありません。
  3. DB。必要に応じて後でデータに対して新しいクエリを作成できるように、jsonをバイナリではなくjsonbフィールドに格納したいと思います。

enter image description here

2

私は最近このようなものを使用する機会がありました:

CREATE FUNCTION gzip(text) RETURNS bytea
    LANGUAGE plperlu IMMUTABLE STRICT COST 100000 PARALLEL SAFE
    AS $_X$
    use Compress::Zlib;
    my $x = Compress::Zlib::memGzip($_[0]);
    return encode_bytea($x);
$_X$;

ただし、bytea自体はエスケープされた形式で送信されるため、サイズが大きくなります。運が良ければ、JDBC実装はそれらがメモリに読み込まれるときにその場でエスケープを解除し、結果セット全体を未加工の形式で保存しない場合があります。申し訳ありませんが、JDBCを十分に理解していません。

すべての行をメモリに読み込むのではなく、カーソルを使用して一度に1行ずつ処理してから破棄することはできませんか?

2
jjanes