c# - 在大文件中搜索性能差异
问题描述
我检查了两种在大文件中搜索的方法。我测试了 500mb 大小的文件。第一种方式花费了 9500 毫秒,第二种方式花费了 11500 毫秒。怎么会发生?缓冲比在每次迭代中访问资源要快。Linq 比 foreach 搜索更强大。内存分配有问题吗?
1:
var __file = new System.IO.StreamReader(file);
var line = "";
while ((line = __file.ReadLine()) != null)
{
var firstOccurrence = line.Contains(contains);
}
__file.Close();
2:
var lines = File.ReadAllLines(_file);
var firstOccurrence = lines.FirstOrDefault(l => l.Contains(contains));
解决方案
在您的第一个代码片段中,您不会在找到匹配项时停止循环。尝试这样的事情:
while ((line = __file.ReadLine()) != null)
{
var firstOccurrence = line.Contains(contains);
if (firstOccurrence)
{
break;
}
}
在您的第二个代码片段中,您将整个文件读入内存,然后开始逐行查看它。这与您的第一个代码片段不同,您在其中一次从磁盘读取文件一行。
等效的方法是File.ReadLines
-- 逐行读取文件:
var firstOccurrence = File.ReadLines(_file).FirstOrDefault(l => l.Contains(Contains));
推荐阅读
- java - 工厂设计模式与OCP(开闭原则)的违反
- mysql - "(" 在此位置无效,需要 EOF,";"
- composer-php - 作曲家,显示建议的包
- android - 我在哪里可以将构建操作设置为“AndroidResource”?
- javascript - 如何在用逗号分隔值的键分隔的数组中排序
- python - TypeError: func() missing 1 required positional argument 'n' leetcode
- node.js - 使用 AWS 生成的凭证连接到 RDS Postgres 时密码验证失败
- python - OpenCV 使用蒙版图像去除背景
- python - 在 Python 中按名称/ID 获取存储驱动器的驱动器号
- angular - 如何从组件中抛出 url 然后将其设置为新的服务 url?