从 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 对象传递给PapaParseparse 函数。那个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 文件并在模板中显示的主要内容,如果未能解决你的问题,请参考以下文章

如何在lua中读取大文件(> 1GB)?

Django:从 QueryDict 读取 JSON 对象数组

Python如何读取巨大的二进制文件(> 25GB)?

如何使用 Windows Batch 读取和编辑 (>3GB) csv 文件?

使用 C# 从存储在 azure blob 存储中的 200gb 文本文件中读取一行

django 项目创建使用