本文介绍了如何在没有拷贝的外部大文件上执行数据库功能的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

下面的测试表明这是可能的,但是我没有经过性能验证(例如与Bash或Python进行比较),我不清楚具体该怎么做或者发生了什么:

  • lo_import/lo_get(在我的test_lo_proc中)创建了该文件的副本,或者(我假设)它可以用作外部引用?
  • 是否需要lo_unlink
  • @a_horse_with_no_name注释的替代方案pg_read_binary_file不受文件大小限制?
CREATE or replace FUNCTION test_lo_proc(
  file_name text
) RETURNS text AS $f$
 DECLARE
  doc_oid oid;
  md5 text;
 BEGIN
  doc_oid = lo_import(file_name);
  md5 = md5(lo_get(doc_oid));
  -- ? lo_unlink(doc_oid)
  RETURN md5;
 END;
$f$ LANGUAGE PLpgSQL;

SELECT test_lo_proc('/tmp/bigbigfile.zip');
PS:MD5用于比较性能(例如使用md5sum *.zip)、实际使用的函数(例如MD5(lo_content||metadata::bytea))或使用内部数据库资源的更复杂的功能.我不是在寻找外部执行(当您可以使用COPY t FROM PROGRAM时)。不是

推荐答案

我能想到两个更好的替代方案:

  1. 按照马的建议,使用pg_read_binary_file将文件读入内存,并使用md5函数计算校验和。

    缺点是您必须将整个文件读取到内存中。

  2. 编写计算文件校验和的PL/perlu或PL/Python函数。这可能会表现得更好。Here是涉及该问题的堆栈溢出问题。

这篇关于如何在没有拷贝的外部大文件上执行数据库功能的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

05-19 07:20