【问题标题】:Python Django open huge filePython Django打开巨大的文件
【发布时间】:2018-01-12 09:04:15
【问题描述】:

我想用 python 构建一个 json 服务。程序将读取一个 json 文件然后返回。我的文件大小 1 GB。当我运行程序时,出现“MemoryError”错误。我的代码是;

def homepage(request):
  file = open("file.json")
  json_file = json.load(file)
  return JsonResponse(json_file)

谁能帮帮我。谢谢...

【问题讨论】:

    标签: python json django memory


    【解决方案1】:

    尝试在内存中读取 1GB 文件确实不是一个好主意,而 FWIW 使用“单片”json 处理庞大的数据集正在突破界限。这个问题主要有三种解决方案,具体取决于您的用例:

    1. 使用像ijson这样的流式json解析器
    2. 使用jsonlines format
    3. 当然还有最明显的:对 json 内容进行分页(这是大多数现有的 rest/json API 所做的)

    前两个解决方案(显然)对“消费者”代码最有效。在这里,您实际上是在“生产者”方面(您的 json 存储在平面文件等中是一个实现细节,与客户端完全无关),因此显而易见的解决方案是将您的 json 拆分为合理大小的块并提供服务它分页(最好在响应中添加当前页面、总页数和指向下一页的链接,以使客户的工作更轻松)。

    【讨论】:

      【解决方案2】:

      你能利用 Django 的 StreamingHttpResponse 类吗? https://docs.djangoproject.com/en/2.0/ref/request-response/#django.http.StreamingHttpResponse

      来自他们的文档:StreamingHttpResponse 类用于将响应从 Django 流式传输到浏览器。如果生成响应时间过长或使用过多内存,您可能需要执行此操作。例如,它对于生成大型 CSV 文件很有用。它需要一个迭代器,但我认为您可以以这样一种方式打开文件,即每行返回一个迭代器而不是整个文件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-31
        • 2018-03-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多