Django实现下载100G的超大CSV文件

news2024/11/26 16:50:35

关注我的公众号「DevOps724」,获取最新的内容分享,带你探索DevOps的无限可能!分享最新的行业趋势、深入的技术分析和实用的工具,帮助你掌握自动化、云计算、持续集成和部署等核心概念。

在这里插入图片描述

在处理大数据集的时候,我们经常遇到的一个问题是内存使用。当我们试图生成一个大型文件,如 CSV,并尝试将其全部加载到内存中时,可能会遇到内存不足的问题。幸运的是,Django 提供了一个解决方案:流传输。本文将详细的讲述如何利用 Django 进行大型 CSV 文件的流传输。

流传输的基础概念

流传输是一种技术,允许你一次发送一小部分响应,而不是一次性加载整个响应到内存中。这种技术对于服务大文件,如图像,音频和大型数据集非常有用。

创建 Django StreamingHttpResponse 对象

StreamingHttpResponse 对象允许我们将响应内容按部分,或者说“流”的形式发送给客户端。试看以下代码:

from django.http import StreamingHttpResponse

def big_file_download(request):
    def file_iterator(file_name, chunk_size=512):
        with open(file_name, "rb") as f:
            while True:
                c = f.read(chunk_size)
                if c:
                    yield c
                else:
                    break
    response = StreamingHttpResponse(file_iterator('big_file.csv'))
    return response

在这里,我们首先创建一个生成器函数 file_iterator,它以 chunk_size 为单位读取文件,然后用这个生成器函数作为 StreamingHttpResponse 的参数,从而创建出一个可以流传输的响应对象。

实现 Django 流传输大型 CSV 文件

现在,我们知道了如何创建 StreamingHttpResponse 对象,接着看一下如何用它来流传输大型 CSV 文件:

import csv
from django.http import StreamingHttpResponse
from .models import Person

class Echo:
    def write(self, value):
        return value

def streaming_csv_view(request):
    persons = Person.objects.all().values_list('name', 'age', 'city')
    pseudo_buffer = Echo()
    writer = csv.writer(pseudo_buffer)
    
    response = StreamingHttpResponse((writer.writerow(person) for person in persons),
                                     content_type="text/csv")
    response['Content-Disposition'] = 'attachment; filename="persons.csv"'
    return response

在上述代码中,我们创建了一个 Echo 类,并将其实例 pseudo_buffer 作为 csv.writer 的参数。这样,我们可以以迭代的方式写入 CSV 行,而不必把它们全部加载到内存中。之后,我们把这个 writerow 方法的迭代器作为 StreamingHttpResponse 的参数。注意,我们此时仍需要设置正确的 MIME 类型和 Content-Disposition 头部。

总结

这就是如何使用 Django 的 StreamingHttpResponse 对象来流传输大型 CSV 文件。完成这个特性后,你应该能够更高效地处理大数据集,且大大降低了内存使用。希望这篇文章对你的开发工作有所帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1393319.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【前沿技术杂谈:智能对话的未来】深入比较ChatGPT与文心一言

【前沿技术杂谈:智能对话的未来】深入比较ChatGPT与文心一言 引言主体智能回复语言准确性知识库丰富度 深入分析:ChatGPT与文心一言的技术对比技术架构和算法数据处理和隐私用户界面和体验 应用场景分析未来展望技术进步的趋势潜在的挑战对社会的影响 结…

[计算机提升] 用户账户控制设置

4.11 用户账户控制设置 用户账户控制设置用来选择何时通知使用者关于计算机更改的消息,是一个比较有用的功能。有时候一些流氓软件在获得权限后可以在后台默认修改注册表或者下载或者安装软件,这个对用户而言,体验不是很好,而且更…

开发实践6_project

要求: ① 页面写入超链接,获取所有数据item,显示在另一个页面,1min内,即使数据有变化,页面内容不变,1min后点击超链接可获取最新信息; ② 使用middleware完成用户请求路径判断 &am…

web前端项目-贪吃蛇小游戏【附源码】

web前端项目-贪吃蛇小游戏 【贪吃蛇】是一款经典的小游戏,采用HTML、CSS和JavaScript技术进行开发,玩家通过控制一条蛇在地图上移动,蛇的目的是吃掉地图上的食物,并且让自己变得更长。游戏的核心玩法是控制蛇的移动方向和长度&am…

C++(12)——string

目录 1.insert: 1.1 string& insert (size_t pos, const string& str): 1.2 string& insert (size_t pos, const char* s): 1.3 string& insert (size_t pos, const char* s, size_t n): 1.4 string& insert (…

【c++】栈(satck)和队列(queue)

目录 一、stack 1.stack的介绍 2.stack的使用 3.stack的模拟实现 二、queue 1.queue的介绍 2.queue的使用 3.queue的模拟实现 三、priority_queue 1.priority_queue的介绍 2.priority_queue的使用 一、stack 1.stack的介绍 (1)stack是一种容…

Baichuan2百川模型部署的bug汇总

1.4bit的量化版本最好不要在Windows系统中运行,大概原因报错原因是bitsandbytes不支持window,bitsandbytes-windows目前仅支持8bit量化。 2. 报错原因是机器没有足够的内存和显存,offload_folder设置一个文件夹来保存那些离线加载到硬盘的权…

包含广告或宣传性质的内容或参考资料不对应,百度百科词条怎么改

想要修改百度百科词条,却发现在编辑百度百科词条时经常提示“包含广告或宣传性质的内容”,又或者经常遇到“参考资料不对应”的情况,我们该如何正确修改百度百科词条才能推广,洛希爱做百科网为大家分享。 修改百科百度百科词条提示…

基于SSM的校园闲置物品交易平台设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…

nexus3 npm-hosted仓库迁移

迁移背景: 从nexus 3.33 升级到 nexus 3.64 过程中,私服 npm-hosted 无法上传。由于这个 npm-hosted 和 npm-proxy 放的同一个 blob存储,无法单独拆除去,所以采用迁移的方式 迁移思路: down下来 npm-hosted 仓库&am…

e2studio开发三轴加速度计LIS2DW12(3)----检测活动和静止状态

e2studio开发三轴加速度计LIS2DW12.3--检测活动和静止状态 概述视频教学样品申请源码下载新建工程工程模板保存工程路径芯片配置工程模板选择时钟设置UART配置UART属性配置设置e2studio堆栈e2studio的重定向printf设置R_SCI_UART_Open()函数原型回调函数user_uart_callback ()…

【征服redis8】Redis的AOF持久化

Redis 支持多种持久化方式来保证数据的可靠性和持久性。前面我们介绍了RDB方式。我们我们介绍第二种方式——AOF(Append Only File)机制是一种常用的持久化方式,它记录了所有对 Redis 数据库进行修改的命令,在 Redis 重启时可以使…

【Java】HttpServlet类中前后端交互三种方式(query string、form表单、JSON字符串)

在前后端的交互中,前端通过以下三种方式来与后端进行交互🌟 ✅query string ✅form表单 ✅JSON字符串 下面我们将书写这三种方式的后端代码并进行讲解 1、Query String QueryString即在url中写入键值对,一般用doGet方法进行交互 代码如下 …

读AI3.0笔记02_起源

1. 起源 1.1. 1955年,28岁的麦卡锡进入了达特茅斯学院的数学系 1.2. 该领域的正式确立可以追溯到1956年由一位名叫约翰麦卡锡的年轻数学家在达特茅斯学院举办的一场小型研讨会 1.2.1. 在1956年,即便是最先进的计算机,其速度也达不到现代智…

HarmonyOS —— buildMode 设置(对比 Android Build Varient)

前言 在安卓中 Build Variant 主要依赖模块(module)中 build.gradle 的 BuildType 和 ProductFlavor 提供的属性和方法,我们可以使用 Build Type 可以配置不同的构建方式、ProductFlavor 主要用来进行多渠道打包。 在鸿蒙中要做到同样像效果…

用CHAT分析高校体育智慧教学体系构建与探索研究现状

CHAT回复:现阶段,高校体育智慧教学体系的构建与探索研究还处于初级阶段,但全球数字化转型大潮的推动下,一些较为前沿的研究和实践已经开始出现: 1.教学平台的建设:很多高校已经开始尝试使用在线教育平台进行…

web蓝桥杯真题--9、水果拼盘

介绍 目前 CSS3 中新增的 Flex 弹性布局已经成为前端页面布局的首选方案,本题可以使用 Flex 属性快速完成布局。 准备 开始答题前,需要先打开本题的项目代码文件夹,目录结构如下: ├── css │ └── style.css ├── im…

【计算机图形学】习题课:Viewing

【计算机图形学】Viewing 部分问题与解答 CS100433 Computer Graphics Assignment 21 Proof the composed transformations defined in global coordinate frame is equivalent to the composed transformations defined in local coordinate frame but in different composing…

2024年腾讯云轻量服务器和CVM云服务器性能如何?

腾讯云轻量服务器和云服务器有什么区别?为什么轻量应用服务器价格便宜?是因为轻量服务器CPU内存性能比云服务器CVM性能差吗?轻量应用服务器适合中小企业或个人开发者搭建企业官网、博客论坛、微信小程序或开发测试环境,云服务器CV…

进阶Docker4:网桥模式、主机模式与自定义网络

目录 网络相关 子网掩码 网关 规则 docke网络配置 bridge模式 host模式 创建自定义网络(自定义IP) 网络相关 IP 子网掩码 网关 DNS 端口号 子网掩码 互联网是由许多小型网络构成的,每个网络上都有许多主机,这样便构成了一个有层次的结构。 IP 地…