从 Django 服务器读取 > 1 GB CSV 文件并在模板中显示
Posted
技术标签:
【中文标题】从 Django 服务器读取 > 1 GB CSV 文件并在模板中显示【英文标题】:Read > 1 GB CSV file from Django server and display in template 【发布时间】:2017-08-07 12:20:21 【问题描述】:我的服务器上目前有一堆巨大的 CSV 文件(其中一个超过 3 GB),我需要对其进行解析并在模板上显示。由于这看起来像 javascript 的东西,我查看了PapaParse
,但似乎我必须将File
对象传递给PapaParse
的parse
函数。那个File
对象的Mozilla link 表示这些类型的对象是在用户上传某些文件时创建的,或者来自html5 Canvas 元素。但我不想那样。该文件已经在我的服务器上,我只需要通读它并以表格格式显示内容。
我尝试了从 Django 简单地解析整个文件并将其传递给模板中的 AJAX
回调的手动方法,但浏览器冻结了,我不得不重新启动服务器。
【问题讨论】:
您将无法以这种方式完整地处理 3GB 文件。想一想:要做到这一点,你的 Django 代码必须消耗整个 3GB 的数据,做它必须做的任何事情(可能在内存中,除非你正在做任何事情来阻止它),然后将整个 3GB 发送到客户端,它必须再次在内存中处理。浏览器死机应该不足为奇!我非常怀疑您是否需要一次显示整个 3GB 数据。您在这里的实际目标是什么? @Chris - 目标是在表格中显示内容。一次可能有 50 行。 【参考方案1】:我的方法是将 CSV 文件加载到数据库中,然后让分页视图完成繁重的工作 (https://docs.djangoproject.com/en/1.11/topics/pagination/)
【讨论】:
这听起来会奏效。但是数据库可以占用多少空间有限制吗?未来可能会有数千 GB 大小的 CSV 文件。 不,没有限制。但是,这取决于您是否将 CSV 存储在单独的表中。如果您要将所有内容存储在一张表中,那么我建议您实施分区策略。 mysql 和 PostgreSQL 都支持分区。在这两种情况下,请确保为快速检索实施索引。 我还有一个问题。假设 CSV 文件的每一行中有 3 个值。所以我在数据库表中有 3 列。但问题是 CSV 文件都有不同的列数。我无法为所有这些创建新表。 在这种情况下,您可能希望使用 MongoDB,因为它完全适合这种情况。 好的,请您指出使这成为可能的 MongoDB 的具体功能吗?【参考方案2】:您应该通过generators
读取 csv 文件以进行内存优化。
你可以通过this link关注
【讨论】:
以上是关于从 Django 服务器读取 > 1 GB CSV 文件并在模板中显示的主要内容,如果未能解决你的问题,请参考以下文章
Django:从 QueryDict 读取 JSON 对象数组
如何使用 Windows Batch 读取和编辑 (>3GB) csv 文件?