gpt4 book ai didi

php - PostgreSQL 和 PHP : Storing large files in multiple schemas: BLOB or BYTEA

转载 作者:行者123 更新时间:2023-11-29 12:00:50 24 4
gpt4 key购买 nike

我需要在 Postgres 数据库中存储大文件(从几 MB 到 1GB)。数据库有多个模式。看起来 Postgres 有 2 个选项来存储大对象:LOB 和 BYTEA。然而,我们似乎在使用这些选项时遇到了问题。

  1. LOB。这几乎是理想的工作方式,最多可以存储 2GB 并允许流式传输,这样我们在读取 LOB 时就不会达到 PHP 后端的内存限制。但是,所有 blob 都存储在 pg_catalog 中,并且不是模式的一部分。当您尝试使用带有选项 –n 和 –b 的 pg_dump 仅转储一个模式及其 blob 时,这会导致一个大问题。它正确地转储模式数据,但是它包括数据库中的所有 blob,而不仅仅是属于特定模式的 blob。有没有办法使用 pg_dump 或其他一些实用程序转储单个模式及其 blob?

  2. 字节茶。这些按模式正确存储,因此 pg_dump –n 可以正常工作,但我似乎找不到流式传输数据的方法。这意味着如果数据大于内存限制,则无法从 PHP 访问数据。

有没有其他方法可以在 Postgres 中存储大数据,允许流式传输并正确处理每个数据库的多个模式?

谢谢。

最佳答案

虽然使用 bytea 不支持流式/文件式 API,但您可以使用它来仅获取部分内容,因此它支持“分块”。

您需要将 bytea 列的存储模式设置为“外部”以禁用压缩,然后您可以在 bytea 列上使用 substring 来仅获取其中的一部分。至少根据文档,这将 DTRT 并有效地仅访问数据库端值的必要部分: http://www.postgresql.org/docs/current/static/storage-toast.html

所以创建一个有点像这样的模式:

create table media.entity(entity_id serial primary key, content bytea not null);
alter table media.entity alter column content set storage external;

然后从内容中获取 8Kb:

select substring(content, 1, 8192) from media.entity where entity_id = 1;
select substring(content, 8193, 8192) from media.entity where entity_id = 1;

不幸的是,TOAST 数据的提取似乎没有计入 explain (buffers on) 计数中,因此很难验证数据库是否按照文档所述执行操作。

关于php - PostgreSQL 和 PHP : Storing large files in multiple schemas: BLOB or BYTEA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12817118/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com