0

一次性读取整个文件而不是根据需要读取字节有什么优点/缺点吗?那么有什么好处:

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-code(字节码)解释器,最初只是编写了一个简单的实现,它根据需要从文件中读取字节并执行必要的操作等。我正在展示该程序的朋友建议我应该而是将整个文件读入内存(Python 列表?),然后从内存中处理它以避免大量缓慢的磁盘读取。测试文件目前小于 1KB,可能最多只有几个 100KB,所以我预计操作系统和磁盘控制器系统会缓存文件,以避免重复读取文件的小块引起的任何性能问题。

4

4 回答 4

3

除了缓存,你还有系统调用。每个都会read()导致模式切换以触发内核。您可以使用strace或其他工具查看系统调用。

不过,这对于 100 KB 的文件来说可能还为时过早。与往常一样,测试您的代码以确定。

于 2013-10-14T14:21:55.840 回答
2

一次调用read()比多次调用更快read()。权衡是,通过一次调用,您必须能够一次将所有数据放入内存中,而通过多次读取,您只需保留总数据量的一小部分。对于只有几千字节或几兆字节的文件,差异不会很明显。对于几个 gig 大小的文件,内存变得更加重要。

此外,进行单次读取意味着所有数据都必须存在,而多次读取可用于处理从外部源流入的数据。

于 2013-10-14T14:37:50.840 回答
2

如果您想做任何类型的随机访问,那么将其放入列表中将比从磁盘中查找要快得多。即使操作系统确实缓存磁盘访问,您也会遇到另一层缓存。在任何情况下,您都无法确定操作系统的行为方式。

以下是我能想到的 3 个案例,它们会激励在内存中进行操作:

  • 您可能有一个跳转指令,您可以通过向程序计数器添加一个数字来执行该指令。对数组的索引执行此操作与查找文件是一个很好的用例。

  • 您可能想要优化 VM 的行为,这可能涉及多次读取文件。扫描列表两次与读取文件两次会快得多。

  • 根据您的语言的操作码和语法,您可能希望在“循环”中向前看以加快执行速度。如果这最终会进行两次搜索,那么这最终可能会降低性能。

如果您的文件总是足够小以适合 RAM,那么可能值得将其全部读入内存。使用真实程序对其进行分析,看看它是否明显更快。

于 2013-10-14T14:22:12.737 回答
1

如果您正在寻找性能,我建议您通过generators。由于您的文件很小,内存不会是什么大问题,但它仍然是一个好习惯。仍然多次从光盘读取文件是可扩展解决方案的明确瓶颈。

于 2013-10-14T14:24:53.350 回答