当前位置: 主页 > 日志 > Django >

Django大文件输出

程序要产生并输出一个100万行左右的JSON数据(大约100MB),按照常规的方法,先在内存中准备好这100万行数据然后输出,服务器用的是Apache + mod_wsgi,一访问服务端就挂了。

查了一下,得知为了避免占用大量的内存导致服务器进程崩溃,最好采用迭代器的方法,如下代码段:

def home(request, epoch=None):
    client_ip = request.META['REMOTE_ADDR']
    if '*' in settings.ALLOWED_IPS or (client_ip and client_ip in settings.ALLOWED_IPS):
        
        # default epoch is 60 seconds ago
        if not epoch:
            epoch = int(time.time() - 60)
        else:
            epoch = int(epoch)
            
        def product_json():
            rows = Details.objects.filter(time_collected__gte=epoch).order_by('auction_id')
            total_number = rows.count()
            yield '{"epoch": %d, "returned_number": %d, "data": [' % (epoch, total_number)
            i = 0
            for row in rows:
                i += 1
                if i < total_number:
                    yield json.dumps(row.to_dict()) + ', '
                else:
                    yield json.dumps(row.to_dict())
            yield ']}'
        
        return HttpResponse(product_json())
    else:
        return HttpResponse(json.dumps({'error': 'Your IP is banned.'}))

参考文章:http://oldj.net/article/django-big-file-response/

[日志信息]

该日志于 2012-05-23 14:28 由 redice 发表在 redice's Blog ,你除了可以发表评论外,还可以转载 “Django大文件输出” 日志到你的网站或博客,但是请保留源地址及作者信息,谢谢!!    (尊重他人劳动,你我共同努力)
   
验证(必填):   点击我更换验证码

redice's Blog  is powered by DedeCms |  Theme by Monkeii.Lee |  网站地图 |  本服务器由西安鲲之鹏网络信息技术有限公司友情提供

返回顶部