我正在尝试确定什么是读取具有多行的大型文本文件、进行一些处理并将它们写入新文件的最快方法。在 C#/.net 中,StreamReader 似乎是一种看似快速的方法,但是当我尝试使用这个文件(逐行读取)时,它的速度大约是 python 的 I/O 速度的 1/3(这让我担心因为我一直听说 Python 2.6 的 IO 比较慢)。
如果没有更快的 .Net 解决方案,是否可以比 StreamReader 更快地编写解决方案,或者它是否已经使用了我永远不希望击败的复杂缓冲区/算法/优化?
你有你在做什么的代码示例,或者你正在阅读的文件的格式吗?
另一个好问题是您一次在内存中保留了多少流?
如果您自己的代码一次检查一个字符,您想使用标记来标记缓冲区的结尾或文件的结尾,这样您的内部循环中就只有一个测试。在您的情况下,一个测试将用于行尾,因此您需要在每个缓冲区的末尾临时粘贴一个换行符,例如。
维基百科关于哨兵的文章根本没有帮助。它没有描述这种情况。您可以在任何 Robert Sedgewick 的算法教科书中找到描述。
您可能还想查看re2c
,它可以生成非常快速的代码来扫描文本数据。它会生成 C 代码,但您可以修改它,您当然可以通过阅读他们关于re2c
.
StreamReader 非常好——你是如何用 Python 阅读它的?如果您指定更简单的编码(例如 ASCII),那么这可能会加快速度。进程占用多少 CPU?
您可以通过使用适当的 StreamReader 构造函数来增加缓冲区大小,但我不知道这可能会产生多大的差异。
StreamReader/FileStream 使用的默认缓冲区大小对于数据中的记录长度可能不是最佳的,因此您可以尝试调整它们。您可以覆盖 FileStream 和包装它的 StreamReader 的构造函数中的默认缓冲区长度。您可能应该使它们具有相同的大小。
一般注意事项:
其实,就是这样。
抱歉,如果我不是 .NET 专家,但在 C/C++ 中,如果您有不错的大缓冲区,您应该能够使用 LL1 解析器对其进行解析,其速度不会比扫描字节慢很多。如果你愿意,我可以提供更多细节。
尝试使用 BufferedReader 和 BufferedWriter 来加快处理速度。