作者huggie (huggie)
看板Python
标题Re: [问题] 关於边读边写 or MemoryStream(.net)
时间Mon May 19 13:49:44 2008
※ 引述《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)
1F:→ qqttpp:原文很怪 他用简体中文当网址所以会读不太到 05/20 00:17
2F:→ qqttpp:另外 因为目标是希望做到像flashget这样多档同时多线下载 05/20 00:19
3F:→ qqttpp:不过的确用直接写硬碟的方式似乎也很有效率 05/20 00:21
4F:→ qqttpp:thread在python不流行阿@@? 可是使用者介面就常常要用不是? 05/20 00:22
5F:→ huggie:使用者介面我就不清楚,可是多工不一定要用thread 05/20 23:05
6F:→ huggie:我猜测 asyncore 跟 twisted 也可以做到你要的 05/20 23:06
7F:→ huggie:我觉得相较於那两者来说,thread 较少用 05/20 23:13
8F:→ huggie:曾为了多工买了本书..里面只讲到三四页.後来才发现别人 05/20 23:13
9F:→ huggie:根本不太用thread 05/20 23:13