在Django网站上处理大文件的最佳方法

问题描述

早上好。

对于使用Django处理大文件的最佳方法,我有一个一般性的问题。

我创建了一个python项目,用户可以在其中读取二进制文件(通常大小在30-100MB之间)。读取文件后,程序将处理文件并向用户显示相关指标。基本上,它会输出数据的最大值,最小值,平均值和标准差。

目前,您只能从cmd行运行此项目。我正在尝试创建一个用户界面,以便任何人都可以使用它。我决定使用Django创建一个网页。该页面非常简单。用户上传文件,然后他选择要处理的文件,并向用户显示指标。

在本地计算机上工作,我能够实现它。我上传了文件(文件保存在用户的笔记本电脑上,然后对其进行处理)。然后,我创建了一个S3帐户,现在文件已全部上传到S3。我遇到的问题是,当我尝试获取文件时(我正在使用smart_open(https://pypi.org/project/smart-open/)),读取文件的速度确实很慢(对于30MB的文件,则需要300秒),但是如果我下载文件并阅读,只花了8秒钟。

我的问题是:从S3检索文件并对其进行处理的最佳方法是什么?我正在考虑将文件下载到我的服务器,对其进行处理,然后将其删除。我已经在本地主机上尝试过了,而且速度很快。从S3下载需要5秒,处理需要4秒。

这是一个好方法吗?我有点担心,例如如果我同时有10个用户,每个用户创建一个报告,那么我将有10 * 30MB =服务器需要的300MB空间。这是可行的,还是我会填满服务器?

谢谢您的时间!

修改 为了提供更多上下文,正在显示的内容是f.read()行。由于二进制文件的格式。我必须通过以下方式读取文件:

name = f.read(30)
unit = f.read(5)
data_length = f.read(2)
data = f.read(data_length)   <- This is the part that is taking a lot of time when I read it directly from S3. If I download the file,then this is super fast.

解决方法

全部

经过一些试验,我找到了适合我的解决方案。

with open('temp_file_name','wb') as data:
    s3.download_fileobj(Bucket='YOURBUCKETNAME',Key='YOURKEY',data)

read_file('temp_file_name')
os.remove('temp_file_name')

我不知道这是最好的方法还是该方法可能导致的失败。如果最终使用其他解决方案,我将使用它并返回本文。

我以前的方法的问题是f.read()花费的时间太长,问题似乎是每次我需要读取新行时,程序都需要连接到S3(或其他东西),并且花了太长时间。最终对我有用的是将文件直接下载到我的服务器上,进行读取,然后在读取文件后将其删除。使用此解决方案,我可以获得在本地服务器上工作时的速度(直接从笔记本电脑读取)。

如果您正在使用中等大小的文件(30-50mb),则此方法似乎可行。我唯一关心的是,如果服务器磁盘空间不足,我们是否尝试下载一个很大的文件。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...