我在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
没有响应,在执行导出写入文件的数据的功能后,一切都运行,文件被保存,但最后一步,给予响应,需要非常长的时间来运行。
1条答案
按热度按时间mum43rcc1#
如果你正在处理一个文件中的数百万行,不要使用ORM。我重写了代码来使用原始SQL,之后对用户的响应正常,没有奇怪的延迟和CPU消耗。显然,垃圾收集器或ORM本身很难科普如此大量的数据。