我将大量文件(二进制数据)加载到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
函数的引用,看起来很有希望,但我找不到如何使用它的示例。
Edit2:最后,在查询中将blob加载为单个参数似乎是最简单的...只要确保它们足够快地进行垃圾收集(例如,不使字节数组成为对象的属性)。 Postgresql非常好地处理数据!
答案 0 :(得分:0)
编辑:DanielVé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;