簡體   English   中英

如何提高讀取大文件並將其作為下載返回的python cgi的性能?

[英]How to improve performance of python cgi that reads a big file and returns it as a download?

我有這個python cgi腳本,檢查它是否從同一個IP多次訪問,如果一切正常,讀取一個大文件格式磁盤(11MB),然后將其作為下載返回。

它有效,但性能很糟糕。 瓶頸似乎是一遍又一遍地讀取這個巨大的文件:

def download_demo():
    """
    Returns the demo file
    """

    file = open(FILENAME, 'r')
    buff = file.read()

    print "Content-Type:application/x-download\nContent-Disposition:attachment;filename=%s\nContent-Length:%s\n\n%s" %    (os.path.split(FILENAME)[-1], len(buff), buff)

我怎樣才能讓它更快? 我想過使用ram磁盤來保存文件,但必須有一些更好的解決方案。 使用mod_wsgi而不是cgi腳本會有幫助嗎? 我能將大文件保存在apache的內存空間嗎?

任何幫助是極大的贊賞。

使用mod_wsgi並使用類似於:

def application(environ, start_response):
    status = '200 OK'
    output = 'Hello World!'

    response_headers = [('Content-type', 'text/plain')]
    start_response(status, response_headers)

    file = open('/usr/share/dict/words', 'rb')
    return environ['wsgi.file_wrapper'](file)

換句話說,使用WSGI標准的wsgi.file_wrapper擴展來允許Apache / mod_wsgi使用sendfile / mmap執行文件內容的優化回復。 換句話說,避免您的應用程序甚至需要將文件讀入內存。

為什么打印都在一個打印聲明中? Python必須生成幾個臨時字符串來處理內容標題,並且由於最后的%s,它必須將文件的全部內容保存在兩個不同的字符串變量中。 這應該會更好。

print "Content-Type:application/x-download\nContent-Disposition:attachment;filename=%s\nContent-Length:%s\n\n" %    (os.path.split(FILENAME)[-1], len(buff))
print buff

您可能還會考慮使用原始IO模塊讀取文件,因此Python不會創建您不使用的臨時緩沖區。

嘗試一次讀取和輸出(即緩沖)一塊16KB的塊。 可能Python在幕后做得很慢,手動緩沖可能會更快。

你不應該使用例如ramdisk - 操作系統磁盤緩存應該為你緩存文件內容。

mod_wsgi或FastCGI有助於您每次運行腳本時都不需要重新加載Python解釋器。 但是,它們對提高讀取文件的性能幾乎沒有作用(如果這真的是你的瓶頸)。 我建議你使用memcached的內容。

暫無
暫無

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

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