簡體   English   中英

在 Django 網站上處理大文件的最佳方法

[英]Best approach to handle large files on django website

大家早上好。

我有一個關於使用 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),這種方法似乎有效。 我唯一擔心的是,如果服務器將耗盡磁盤空間,我們是否會嘗試下載一個非常大的文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM