为什么django不能返回一个纯文本响应,并带有下载文件的链接?

rkue9o1l  于 2023-10-21  发布在  Go
关注(0)|答案(1)|浏览(103)

我在Django eksport功能,在自定义管理.因此,当请求从数据库中获取所有内容时,我对必要的示例进行ORM查询-查询很重,但它工作正常,我立即获取数据,不再需要访问数据库。然后是与此数据工作的功能,推无处不在,处理,最后推到框架Pandas和写入CSV文件,并保存在目录中(之前,立即试图给给予用户),该文件重约280 MB。那么,实际的问题是什么,真实的文件保存的相对快,但是给用户的React却可以从半个小时,仅仅是一个下载文件的链接。

def save_data_in_csv_file(df_jewelry):
    """write data

    Attributes:
    - df_jewelry: data frame pandas +- 1_300_000 rows.
    """

    download_folder = os.path.join(os.path.dirname(__file__), 'download_file')

    if not os.path.exists(download_folder):
        os.makedirs(download_folder)

    file_path = os.path.join(download_folder, 'output.csv')

    with open(file_path, 'wb') as file:
        df_jewelry.to_csv(file, index=False)

    download_link = (
        'path_to_file'
    )

    response_data = {
        'message': 'File save!',
        'download_link': download_link,
    }

    response = Response(response_data, status=201)
    return response

这是一个视图,它运行主脚本,从上面的代码中获取响应,然后将其提供给用户。

class ExportView(APIView):
    # permission_classes = (IsAdmin,)

    def post(self, request):
        request = request.data

        if not request:
            return Response(
                {'error': 'in request incorrect data.'},
                status=status.HTTP_400_BAD_REQUEST
            )

        return get_product_list(request)

因此,它可以像这样挂起半个小时,当它最终给出时(它并不总是发生),CPU被释放,但RAM没有被释放。
查询本身在非生成器上运行,这样就不会携带整个查询,否则将占用大约8 GB的空间

...
    for product in product_list.iterator(chunk_size=10000): # +- 156.000 data
        yield product

没有响应,在执行导出写入文件的数据的功能后,一切都运行,文件被保存,但最后一步,给予响应,需要非常长的时间来运行。

mum43rcc

mum43rcc1#

如果你正在处理一个文件中的数百万行,不要使用ORM。我重写了代码来使用原始SQL,之后对用户的响应正常,没有奇怪的延迟和CPU消耗。显然,垃圾收集器或ORM本身很难科普如此大量的数据。

相关问题