ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python – 生成大文件并发送它

2019-07-22 15:55:35  阅读:184  来源: 互联网

标签:python large-files tornado


我有一个相当大的.csv文件(最多100万行),我想在浏览器请求时生成和发送.

我当前的代码是(除了我实际上没有生成相同的数据):

class CSVHandler(tornado.web.RequestHandler): 
  def get(self):
    self.set_header('Content-Type','text/csv')
    self.set_header('content-Disposition','attachement; filename=dump.csv')  
    self.write('lineNumber,measure\r\n') # File header
    for line in range(0,1000000): 
      self.write(','.join([str(line),random.random()])+'\r\n') # mock data

app = tornado.web.Application([(r"/csv",csvHandler)])
app.listen(8080)

我对上述方法的问题是:

> Web浏览器不直接开始下载发送的块.它挂起,而网络服务器似乎准备整个内容.
> Web服务器在处理此请求时被阻止,并使其他客户端挂起.

解决方法:

默认情况下,所有数据都在内存中缓冲,直到请求结束,以便在发生异常时将其替换为错误页面.要以递增方式发送响应,您的处理程序必须是异步的(因此它可以与响应的写入和IOLoop上的其他请求交错)并使用RequestHandler.flush()方法.

请注意,“异步”与“使用@ tornado.web.asynchronous装饰器”不同;在这种情况下,我建议使用@ tornado.gen.coroutine而不是@asynchronous.这允许您在每次刷新时简单地使用yield运算符:

class CSVHandler(tornado.web.RequestHandler): 
    @tornado.gen.coroutine
    def get(self):
        self.set_header('Content-Type','text/csv')
        self.set_header('content-Disposition','attachment; filename=dump.csv')  
        self.write('lineNumber,measure\r\n') # File header
        for line in range(0,1000000): 
            self.write(','.join([str(line),random.random()])+'\r\n') # mock data
            yield self.flush()

self.flush()启动将数据写入网络的过程,并且等待直到数据到达内核.这使得其他处理程序可以运行并且还可以帮助管理内存消耗(通过限制客户端下载速度可以提前多远).在CSV文件的每一行之后刷新有点贵,因此您可能只想在每100或1000行之后进行刷新.

请注意,如果下载开始后出现异常,则无法向客户端显示错误页面;你只能在中途减少下载.尝试验证请求并在第一次调用flush()之前执行可能失败的所有操作.

标签:python,large-files,tornado
来源: https://codeday.me/bug/20190722/1504608.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有