一次读取整个文件是否有任何优点/缺点,而不是根据需要读取字节?那么有什么好处:
file_handle = open("somefile", rb)
file_contents = file_handle.read()
# do all the things using file_contents
与之相比:
file_handle = open("somefile", rb)
part1 = file_handle.read(10)
# do some stuff
part2 = file_handle.read(8)
# do some more stuff etc
背景:我正在用Python编写一个p代码(字节码)解释器,最初编写了一个简单的实现,根据需要从文件中读取字节并执行必要的操作等。我正在展示该程序的朋友建议我应该将整个文件读入内存(Python列表?),然后从内存中处理它以避免大量慢速磁盘读取。测试文件目前不到1KB,最多可能只有几百KB,所以我希望操作系统和磁盘控制器系统能够缓存文件,避免因重复读取文件的小块而导致的任何性能问题。
答案 0 :(得分:3)
暂停缓存,您仍然有系统调用。每个read()
都会导致模式切换以触发内核。您可以使用strace
或其他工具查看系统调用。
虽然这对于100 KB的文件来说可能为时过早。与往常一样,测试您的代码以确定无疑。
答案 1 :(得分:2)
如果您想进行任何类型的随机访问,那么将其放入列表中要比从磁盘中搜索要快得多。即使操作系统确实缓存磁盘访问,您也会遇到另一层缓存。无论如何,您无法确定操作系统的行为方式。
以下是我能想到的3个案例,可以激励你在记忆中做到这一点:
您可能有一个跳转指令,可以通过在程序计数器中添加一个数字来执行。对数组的索引执行此操作与查找文件是一个很好的用例。
您可能希望优化VM的行为,这可能涉及多次读取文件。扫描列表两次与读取文件两次会更快。
根据您的语言的操作码和语法,您可能希望在“周期”中向前看,以加快执行速度。如果最终做了两次搜索,那么最终可能会降低性能。
如果你的文件总是小到足够适合RAM,那么它可能值得将它全部读入内存。使用真实程序对其进行分析,看看它是否明显更快。
答案 2 :(得分:2)
对read()
的单次通话比对read()
的多次通话要快。权衡是,只需一次调用,您就必须能够同时将所有数据放入内存中,而对于多次读取,您只需保留数据总量的一小部分。对于只有几千字节或兆字节的文件,差异不会很明显。对于几个演出规模的文件,内存变得更加重要。
此外,执行单个读取意味着必须存在所有数据,而多个读取可用于处理从外部源流入的数据。
答案 3 :(得分:1)
如果您正在寻找表现,我建议您浏览generators。由于文件大小较小,因此内存不会引起太大关注,但它仍然是一种很好的做法。仍然多次从光盘读取文件是可扩展解决方案的明确瓶颈。