Django文本区,用于50000000字符数据

Django文本区,用于50000000字符数据,django,postgresql,django-models,Django,Postgresql,Django Models,我有一个django应用程序,它处理大约50000000个字符的大型文本文件。出于各种原因,最好将它们存储为模型字段 我们将sqlite用于开发,将postgres用于生产 用户不需要通过任何UI输入数据 该字段不需要在管理员或用户的其他位置可见 几个问题: 在textarea字段中存储这么多文本是否可行 这可能会产生什么(如果有)性能问题 使用二进制字段会提高性能吗 任何指导都将不胜感激。这与您使用的数据库更相关。您使用SQLite,因此请查看SQLite的限制: 定义了SQLite中

我有一个django应用程序,它处理大约50000000个字符的大型文本文件。出于各种原因,最好将它们存储为模型字段

  • 我们将sqlite用于开发,将postgres用于生产
  • 用户不需要通过任何UI输入数据
  • 该字段不需要在管理员或用户的其他位置可见
几个问题:

  • 在textarea字段中存储这么多文本是否可行
  • 这可能会产生什么(如果有)性能问题
  • 使用二进制字段会提高性能吗

任何指导都将不胜感激。

这与您使用的数据库更相关。您使用SQLite,因此请查看SQLite的限制:

定义了SQLite中字符串或BLOB的最大字节数 由预处理器宏SQLITE_MAX_LENGTH执行。此参数的默认值 宏是10亿(10亿或100000000)

除此之外,在Django中使用a可能更好


二进制字段不会提高性能。二进制字段用于二进制数据,您正在存储文本。

另一个需要考虑的问题是,当您查询该模型时,请确保在查询集上使用,这样您就不会在每次从数据库检索对象时都将50MB的数据传输到管道中


不过,我强烈建议将这些文件存储在磁盘或S3或类似的文件字段中。您将无法真正有效地查询这些文件的内容。

经过一些实验,我们决定使用Django文件字段,而不是将文件内容存储在Postgresql中。性能是主要的决策驱动因素。使用file field,我们可以非常快速地查询以获取底层字段文件,而这些文件反过来又可以在操作系统级别直接访问,其性能远远高于数据存储在Postgresql表中时可用的性能


谢谢你的意见。这是一个很大的帮助。

PostgreSQL对这种大小的东西一点也不关心,它将以压缩的形式从主元组中存储它。只要确保你的应用程序在不需要该列的情况下不会获取它,尤其要确保它不会做一些愚蠢的事情,比如
更新中设置
,即使它没有更改,因为这会不必要地膨胀事务日志和TOAST表。谢谢Craig。我不知道PostgreSQL和压缩。这是一个大问题。目前,此文本存储在压缩文件系统上的文件中。有人担心将它们未压缩地存储在未压缩的文件系统上。由于PostgreSQL将进行压缩,因此消除了这种顾虑。这取决于。。。PostgreSQL有意使用更快、效率更低的压缩编解码器,这通常是一种更好的性能/空间折衷,并且不受专利限制。有人讨论过要把它改成cpu更昂贵、更有效的,但专利问题会让事情变慢。我们仍在考虑一些替代设计,但我们可能会使用从blob派生的自定义模型字段,其中文本在存储中压缩,在访问时解压缩。我们将blob与textfield相对照,以避免编码以适应textarea字符问题。由于数据通常是一次写入/一次读取,我们并不特别关心压缩/解压缩的cpu成本。谢谢Sohan。在这个应用程序中,我们实际上不需要查询文本文件的内容,所以在本例中这不需要考虑。在某种程度上,我们试图避免使用文件系统文件以及与控制数据库断开连接的文件的相关风险,因为文本文件当前存储在一个符号链接的压缩文件系统上(我们遇到了一些断开连接的文本文件问题,这是需要解决的难题)。