作者os653 (allstar)
看板Python
标题[问题] 如何从硬碟读取资料而不是从记忆体
时间Mon Jan 9 11:45:08 2012
读取一个档案,关闭後,再次重新读取同一个档案
其资料似乎在第一次读取时会被 windows 放到记忆体里
使第二次读取时直接从记忆体里读取,而不是从硬碟读取
虽然这样让读取速度加快非常多,但是我是想要比对档案是否有出错
如果读取资料是读记忆体那就没意义了
请问该怎麽做才能让第二次读取档案时从硬碟读取?
举例来说,将下面的 code 连续执行两次
import datetime
t1 = datetime.datetime.today()
with open('filename', 'rb') as file:
data = file.read()
t2 = datetime.datetime.today()
print t2-t1
t1 = datetime.datetime.today()
with open('filename', 'rb') as file:
data = file.read()
t2 = datetime.datetime.today()
print t2-t1
得到结果
C:\test>test.py
0:00:05.925000
0:00:00.378000
C:\test>test.py
0:00:00.328000
0:00:00.353000
看起来只有第一次读取资料花了五秒钟,第二三四次都是瞬间读完
资料大小是 600MB,花五秒钟读取跟正常硬碟读取速度差不多
其他的怎麽看都不像是从硬碟读取的阿
还是我哪里理解有误?Google 也不知道要打什麽关键字才能找到答案
请指点一下,谢谢
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.46.150.93
1F:→ KSJ:你读完第一次後 修改档案内容 第二次读档会跟着更新吧? 01/09 12:21
2F:推 timTan:我觉得不用考虑到这个层次耶? 01/09 12:43
3F:→ timTan:怀疑到这个层次满细心的,但os帮你做这件事,不易出错吧? 01/09 12:44
4F:→ timTan:你就想成记忆体里的跟硬碟里的事一样的吧。 01/09 12:44
5F:推 chchwy:不需要担心这种事 OS会搞定 01/09 14:02
6F:→ os653:我对OS还挺有信心的,不过对硬体没啥信心 XD 01/09 18:08
7F:→ os653:举例来说,以前有次IDE/SATA转USB传输线出包,多焊一个电阻 01/09 18:11
8F:→ os653:导致资料写入没问题,但读取时会随机出错,档案比对会差一点 01/09 18:12
10F:→ os653:自己也有遇过类似情形,但确定是硬碟出错 01/09 18:15
11F:→ os653:像这种情形,有办法写程式在复制资料的时候就找出问题吗? 01/09 18:17
12F:→ os653:本来是想写个带检查的复制程式,但不会真正读取硬碟没用... 01/09 18:20
13F:→ os653:TeraCopy也有这种检查功能,不晓得有没有一样的问题 01/09 18:50
14F:推 angusj:用os.O_DIRECT参数open? 01/09 20:17
15F:→ os653:python 2.6.6 64bit没这个参数耶,document说 01/09 21:15
16F:→ os653:O_ASYNC, O_DIRECT, O_DIRECTORY, O_NOFOLLOW, O_NOATIME 01/09 21:16
17F:→ os653:These constants are GNU extensions and not present if 01/09 21:16
18F:→ os653:they are not defined by the C library. 01/09 21:16
19F:推 angusj:这可能是指win底下没这参数,毕竟这需要OS支援... 01/09 21:39
20F:→ angusj:open有个buffering参数,设为0试试... 01/09 21:50
21F:→ os653:那个没用,之前就试过了 01/09 21:53
22F:→ os653:有找到两个不知道可不可行的方法 01/09 21:57
24F:→ os653:不过电脑已经移除C++很久了,现在也没空间重装 XD 01/09 21:59
25F:→ os653:而且底下有人说在一台电脑可行但另一台电脑不行,不太稳定 01/09 22:00
26F:→ os653:另外一个是暴力法,直接复制另一个垃圾大档案把cache清掉 01/09 22:01
27F:→ os653:不过在同时间有其他程式在存取之前的档案,此法就很可能无效 01/09 22:02
28F:→ os653:所以这方法不稳定而且有点蠢...还有没有其他解法 Q_Q 01/09 22:03
29F:→ os653:而且第一个方法用pywin写也没用... 01/09 22:36
30F:→ modocolor:你需要翻资料或联络 python team 去确认 01/27 23:45
31F:→ modocolor:也可以改用 Windows 32 API 去做改善,弹性较好 01/27 23:52
32F:→ modocolor:像是效能检测的软体就只能用这种方式测试 01/27 23:52
33F:→ modocolor:硬体读写的这些事情 OS 会接管 所以建议改用Win API @_@ 01/27 23:53