2012-03-04 74 views
1

在Django中上傳大量文件時遇到問題。上下文如下:我有一個電子表格,其中一列或多列是圖像文件名;這些圖像通過輸入類型=文件和選項倍數的表單上傳。在Django中上傳大量文件時遇到問題

只有幾行 - 說70,一切都很好。但是隨着更多的線條和更多的圖像,隨機位置會出現IOError。

我查了一下Django的文件/圖片上傳幾個問題,但無法找到任何有關我的問題。

我正在使用的模型是LFS(www.getlfs.com)的產品模型。我們正在開發一個基於LFS的系統,爲了便於批量創建數十種產品,我們編寫了一些視圖和模板,通過電子表格接收主要產品屬性。每一行都是一個產品,列是所需的屬性。

LFS使用自定義類ImageWithThumbsField(ImageField)存儲產品圖像,並在保存產品實例(從電子表格獲取)時生成所有縮略圖。這是一個耗時(cpu)的任務,我最初的猜測是,由於某種原因,臨時文件在所有處理髮生之前被刪除。

有沒有辦法讓這些上傳的文件保留更多時間?任何其他方法建議能夠處理數百個上傳的文件?有關可能發生什麼的任何提示?

希望你能理解我的問題。如果需要,我可以發佈代碼。

鏈接的LFS代碼相關部分:

  • 其中縮略圖生成:

https://github.com/diefenbach/django-lfs/blob/master/lfs/core/fields/thumbs.py

  • 產品型號

https://github.com/diefenbach/django-lfs/blob/master/lfs/catalog/models.py

在此先感謝!

+0

您能否請您發佈追蹤錯誤?你如何運行你的應用程序?通過Web服務器或Django的devserver也會引發錯誤? – ilvar 2012-03-04 02:41:19

+0

在接下來的4天內,追溯的部分內容將在http://dpaste.com/711195/ – momenezes 2012-03-04 19:03:35

回答

1

這聽起來像你內存不足。當Django processess上傳,直到形式驗證所有的文件都可以:

  • 保持在Python/WSGI過程/工人內存裏。(運行服務器的普通模式)

    在這種情況下,您正在上傳足夠的照片來填充進程內存並耗盡空間。對於IOError發生的位置,您可以想象這將是非確定性的(GC依賴)。

  • 暫時存儲在/ tmp/(阿帕奇的通常設置)

    在這種情況下,Web服務器的RAMFS充滿尚未被寫入磁盤映像。在這種情況下,應該在同一個地方放置IOError。

不管怎樣,您都不應該以這種方式批量上傳圖片。 Apache/Django不是爲它設計的。嘗試上傳每個請求/響應的單個產品/圖片,所有問題都將消失。

+0

+0.5中相當大膽; +0.5因爲我喝醉了。似乎也是一個受過教育的答案 - 但我只能提供1分。 – dokkaebi 2012-03-04 05:46:20

+0

@Thomas:看起來你的答案非常接近或者確實是真實的事實。當PIL嘗試讀取文件時,它是一個0KB文件,可能是由於您編寫的一些原因。 您是否認爲將臨時存儲更改爲磁盤可能有所幫助? 感謝您的回答。 – momenezes 2012-03-04 19:09:34

+0

@momenezes是否真的有必要上傳1請求中的所有圖片?我不知道有什麼方法可以在django中進行基於磁盤的上傳。 – Thomas 2012-03-05 05:56:11