Re: [問題] 關於邊讀邊寫 or MemoryStream(.net)
※ 引述《qqttpp (ㄎ一歐)》之銘言:
: ===================================
: 但是其實我真正想要做的是
: 有一個中間的buffer可以使下載跟存入硬碟同時進行(要寫入硬碟要等資料量達一定)
: 所以流程變成是
: 先起頭下載
: 立刻啟動寫入硬碟機制
: (已經下載的資料正在寫入硬碟,未下載資料正從網路下載回來)
: 未下載資料網路下載完成
: 已下載的資料寫入完成
: 另外我也查了很多的資料 從這篇好像就是描述怎樣使用python達成這功能
: 眾裡尋她,驀然回首——Python的流機制:
: http://0rz.tw/8044I
: 後來模仿大大的方法做了一個類似的東西
這 URL 我打不開耶..
: ===================================
: uf = urllib.urlopen(url)
: f = open(fn, 'wb')
: def buff(uf):
: try:
: data=""
: lines=0
: for line in uf:
: data += line
這行很慢吧?! data 是字串類別嗎? 字串要一直串接是很沒有效率的,
data 改成 list 然後用 append 比較好。
Java 這樣也會超級沒效率的。
用 list 就是類似於 C# 的 StreamBuffer 這樣來使用。
: lines=lines+1
: if lines==1000:
: lines=0
: break
: yield data
這邊再把他接起來 ''.join(data)
你要不要試試看看會不會比較快?
: except StopIteration, e:
: f.close()
: return
: while True:
: try:
: f.write(buff(uf).next())
: except:
: f.close()
: =========================================
: 可是事後證明這樣超級銷耗cpu資源
雖然我覺得 data 慢應該是慢在 network,可是你又說耗 CPU,所以
我猜有可能是一直 cat 那個字串的結果。(不確定)
另外你寫的這似乎還是沒有做到你想要的,因為 write 是個會 block 的呼叫。
應該要用上面那個大大所說得 thread。
但 thread 在 Python 領域裡面似乎是不太盛行的,因為 thread 容易造成
撰寫時的錯誤,一般來講是如不需要,盡可能避免的。如果真的需要多工的時候,
一般應該是用 asyncore 或 Twisted 吧?! (小弟兩個都沒接觸過)
個人認為,disk write 比 network 速度要快很多,依照 Big O 的觀念
為了這個多工是不值得的。 (雖然我對 1.7Mb/s的速度跟硬碟寫入的速度差
別沒什麼感覺..我只是說個通則) 即使多工,大部分時間你的 disk write
的邏輯還是得在那邊等待那個 data 塞滿,不會省太多時間的。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.129.160.62
※ 編輯: huggie 來自: 140.129.160.62 (05/19 13:51)
→
05/20 00:17, , 1F
05/20 00:17, 1F
→
05/20 00:19, , 2F
05/20 00:19, 2F
→
05/20 00:21, , 3F
05/20 00:21, 3F
→
05/20 00:22, , 4F
05/20 00:22, 4F
→
05/20 23:05, , 5F
05/20 23:05, 5F
→
05/20 23:06, , 6F
05/20 23:06, 6F
→
05/20 23:13, , 7F
05/20 23:13, 7F
→
05/20 23:13, , 8F
05/20 23:13, 8F
→
05/20 23:13, , 9F
05/20 23:13, 9F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 5 之 5 篇):
Python 近期熱門文章
PTT數位生活區 即時熱門文章