【问题标题】:PostgreSQL: "index row requires 1460216 bytes, maximum size is 8191"PostgreSQL:“索引行需要 1460216 字节,最大大小为 8191”
【发布时间】:2018-11-30 10:45:03
【问题描述】:

我是 PostgreSQL 新手,我正在尝试使用 Python 构建的字典列表的内容填充一个表,如下所示:

diclist = [{'accession':'value', 'species':'value', 'seq':'value', 'length': 'value'}, {'accession':'value', 'species':'value', 'seq':'value', 'length': 'value'}, ...]

'seq' 值是有时超过 300.000 个字符的字符串...

但是,我的数据包括很长的基因序列,所以当我尝试将这些数据加载到表中时,PostgreSQL 声明如下:

索引行需要 1460216 字节,最大大小为 8191

有没有办法增加行索引的最大大小?或者有没有办法压缩我的数据所需的空间?

我知道 BioPython 和 BioSQL 是用来处理基因序列的,但它们并不完全符合我的需要......

这是我暂时构建的函数(diclist 是字典列表):

def insert_biosequence(diclist):
try:
params = config()
conn = psycopg2.connect(**params)
cur = conn.cursor()
cur.executemany("""INSERT INTO biosequence(accession, species, seq, length) VALUES (%(accession)s, %(species)s, %(seq)s, %(length)s)""", diclist)
conn.commit()
cur.close()
  except (Exception, psycopg2.DatabaseError) as error:
print(error)
finally:
if conn is not None:
  conn.close()

我的 CREATE TABLE 命令如下:

CREATE TABLE biosequence (
accession TEXT,
species TEXT,
seq TEXT PRIMARY KEY,
length INTEGER

);

我没有使用任何 INDEX 命令,我认为它是由 PostgreSQL 默认完成的……我应该这样做吗?

【问题讨论】:

  • 欢迎来到 SO。您能否也分享您的数据样本以及您正在使用的索引类型?
  • 请edit您的问题并为相关表添加create table 语句,包括所有索引和您正在使用的INSERT 语句。您插入的数据是什么样的?你为什么要索引这么大的文本值?一开始这很少有用。 Formatted text 请no screen shots。 edit您的问题不要在 cmets 中发布代码。
  • 你不能索引这么长的值。索引其中的一部分并在您的 WHERE 条件中使用该部分。
  • 我已经用你的问题更新了帖子!谢谢!
  • @SoniaOlaecheaLázaro 您是否偶然使用 PostBIS? github.com/no0p/postbis

标签: python postgresql indexing


【解决方案1】:

鉴于您的数据是结构化的,您可能希望创建一个更适合您的结构的架构,然后以该格式加载它,而不仅仅是原始源数据,或者至少加载原始数据,然后将其转换为您的结构格式,以便于搜索。

否则,您可以使用带有 GIN 索引的全文搜索或带有 pg_trgm 运算符的 GIN 索引。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-09
    相关资源
    最近更新 更多