Perl读取文件与遍历数组性能

Perl读取文件与遍历数组性能,perl,Perl,我需要根据多个值测试文件中的行 每次打开文件并逐行读取与将文件放入数组后打开并每次遍历数组在时间上有什么区别?在前一种情况下,您可以在每一行上执行所需的所有测试(而不是每次重新读取文件),那么这两种方法的速度和I/O、CPU效率应该大致相同(忽略二阶效应,例如磁盘IO是否更容易被其他进程分心)。但是,后一种情况—读取整个文件—可能会达到大型文件的内存限制,这可能会导致其性能急剧下降,甚至失败 逐行处理文件的主要成本是失去灵活性-例如,如果需要交叉引用这些行,这将不容易(如果它们都在内存中,那么这

我需要根据多个值测试文件中的行


每次打开文件并逐行读取与将文件放入数组后打开并每次遍历数组在时间上有什么区别?

在前一种情况下,您可以在每一行上执行所需的所有测试(而不是每次重新读取文件),那么这两种方法的速度和I/O、CPU效率应该大致相同(忽略二阶效应,例如磁盘IO是否更容易被其他进程分心)。但是,后一种情况—读取整个文件—可能会达到大型文件的内存限制,这可能会导致其性能急剧下降,甚至失败


逐行处理文件的主要成本是失去灵活性-例如,如果需要交叉引用这些行,这将不容易(如果它们都在内存中,那么这样做的代码将更简单、更快)。

在前一种情况下,您可以在每行上执行所需的所有测试(而不是每次都重新读取文件),那么这两种方法的速度和I/O、CPU效率应该大致相同(忽略二阶效应,例如磁盘IO是否更容易被其他进程分心)。但是,后一种情况—读取整个文件—可能会达到大型文件的内存限制,这可能会导致其性能急剧下降,甚至失败


逐行处理文件的主要成本是失去灵活性-例如,如果需要交叉引用这些行,这将不容易(如果它们都在内存中,那么这样做的代码将更简单、更快).

进一步说明@mpacpec在评论中所说的,文件IO总是比内存读/写慢。但故事还有更多。“根据多个值测试文件中的行”可以用很多方式来解释,因此在不知道您到底在做什么的情况下,没有人能告诉您更具体的事情。因此答案是“这取决于”。这取决于文件大小、测试内容、频率以及测试方式

然而,从实际角度讲,根据我对你所说内容的理解,你必须以这样或那样的方式阅读整个文件,并且你必须以这样或那样的方式测试每一行。做最容易写/读/懂的事情,看看是否足够快。如果不够快,你就有了一个更有用的基线来询问问题就个人而言,我会从一个逐行读取和测试循环开始,然后从那里开始工作,因为我认为这样更容易、更快地正确编写


让它工作,然后让它快速:)

要扩展@mpacpec在评论中所说的内容,文件IO总是比内存读/写慢。但故事还有很多。“针对多个值对文件中的行进行测试”可以用多种方式解释,因此,如果不知道您到底想做什么,那么没有人可以告诉您更具体的内容。所以答案是“视情况而定”。这取决于文件大小、测试内容、频率以及测试方式

然而,实际上,根据我对你所说内容的理解,你必须以这样或那样的方式阅读整个文件,并且你必须以这样或那样的方式测试每一行。做最容易写/读/懂的事情,看看是否足够快。如果不是这样,那么你就有了一个更有用的基线来提问。就我个人而言,我会从一个逐行读取和测试循环开始,然后从那里开始工作,因为我认为这样更容易、更快地正确编写


让它工作,然后让它快速:)

IO总是比内存慢。这纯粹是性能问题。它与算法复杂度(“big-O”)无关。IO总是比内存慢。这纯粹是性能问题。它与算法复杂性(“大O”)无关。mmap呢?读取映射到进程vm的文件是否仍然比内存读/写慢?如果位在磁盘上,则必须在某个时候从磁盘读取并写入内存。当您读取映射到文件的内存时,在某个级别上,会发生文件IO。这是没有办法的。根据它的实现方式,它可能会更快。你想修复的坏东西是什么?没有坏东西,而且我不是一个新手程序员。我在大声思考。代码正在运行,我想改进它。现在,它是一个循环,每次迭代都会重新打开文件,这似乎不是一个好主意,也不是想推断出其他情况,如果我表现出屈尊俯就,我会道歉。重新打开文件当然是一种可以忽略的冗余——事实上,我可以想象至少有一种情况会导致偶尔的失败。根据你所说的,我怀疑性能特征将与测试的总数(而不是行数)相关。@Jabda:无论你是逐行工作,还是对文件进行处理,都应该可以安排只循环一次所有内容,除非在测试中有什么东西阻止了它(例如,第二个测试在其逻辑中使用了第一个测试的一些聚合值),那么mmap呢?读取映射到进程vm的文件是否仍然比内存读/写慢?如果位在磁盘上,则必须在某个时候从磁盘读取并写入内存。当您读取映射到文件的内存时,在某个级别上,会发生文件IO。这是没有办法的。根据它的实现方式,它可能会更快。你想修复的坏东西是什么?没有坏东西,而且我不是一个新手程序员。我在大声思考。代码正在运行,我想改进它。现在,它是一个循环,每次迭代都会重新打开文件,这似乎不是一个好主意,并不意味着推断出其他情况,如果我来了,请道歉