[英]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.