1

我正在将大量文件(二进制数据)加载到 Postgres 数据库中(文件作为 blob 存储在数据库中)。

我发现的一种方法是使用大对象,效果很好。但是,出于各种原因,我想探索将文件内容直接存储在 bytea 字段中的可能性。现在,大对象管理器允许我直接将字节块直接写入其缓冲区,无需先将整个文件加载到内存中。

这对我来说相当重要,因为我加载文件时有多个并行工作的线程(如果所有线程同时将整个文件加载到内存中,GC 就无法跟上)。

有什么办法可以用 bytea 参数做到这一点?我在考虑一个 SQL 函数,它将一大块字节附加到一行的 bytea 字段。然后我可以重复调用这个函数来获取一个 blob。我对 PostgreSQL 很陌生,所以我真的可以提示这样一个 SQL 函数的外观。

那么,如何在 PostgreSQL 中附加到一个 bytea blob?

顺便说一句,替代想法也受到赞赏。

我正在使用 PostgreSQL 9.3、C# (.NET 4) 和 NpgSql Postgres 数据提供程序,文件 (blob) 可以是从几 kb 到几 mb 的所有内容。

编辑:我看到了对byteacat函数的引用,看起来很有希望,但我找不到如何使用它的示例。

编辑2:最后,在查询中将blob作为单个参数加载似乎是最简单的......只要确保它们足够快地被垃圾收集(例如,不使字节数组成为一个属性目的)。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 回答