如何修改C#代码处理TXT百万条记录以避免内存溢出
解决大文件读取内存溢出问题
原代码的核心问题是将所有拆分后的数据一次性存入List<string>,百万级记录会导致内存被大量占用,最终触发OutOfMemoryException。解决思路是采用流式处理/延迟加载,避免一次性加载全部数据到内存。
方案1:流式处理(推荐,内存占用极低)
如果你的需求是读取数据后直接处理(比如写入数据库、实时分析等),不需要把所有数据存在内存里,直接在遍历过程中处理每一条数据即可:
public void ProcessDataFromFile(string filePath) { foreach (var line in File.ReadLines(filePath)) { if (string.IsNullOrWhiteSpace(line)) continue; var data = line.Split('|'); foreach (var item in data) { // 在这里直接处理item,比如写入数据库、输出到其他文件等 // ProcessItem(item); } } }
方案2:延迟加载返回数据
如果必须返回所有数据,不要用List<string>(会一次性加载全部数据),改用IEnumerable<string>实现延迟加载,只有在枚举数据时才会逐行读取拆分:
public IEnumerable<string> ExtractDataFromFile(string filePath) { foreach (var line in File.ReadLines(filePath)) { if (!string.IsNullOrWhiteSpace(line)) { var data = line.Split('|'); foreach (var item in data) { yield return item; } } } }
使用时,遍历这个返回的IEnumerable<string>即可,内存只会保留当前处理的行和数据项:
foreach (var item in ExtractDataFromFile("largefile.txt")) { // 处理每个item }
额外说明
原方法声明返回List<Test>,但实际代码是收集string类型数据,推测是笔误。如果需要将数据转换为Test对象,同样可以用流式处理或延迟加载:
public IEnumerable<Test> ExtractTestDataFromFile(string filePath) { foreach (var line in File.ReadLines(filePath)) { if (string.IsNullOrWhiteSpace(line)) continue; var data = line.Split('|'); // 假设Test的构造或初始化逻辑 var testObj = new Test { // 根据data的索引赋值,比如: // Property1 = data[0], // Property2 = data[1] }; yield return testObj; } }
这样无论文件多大,内存都只会保留当前处理的行和单个Test对象,不会出现内存溢出。
内容的提问来源于stack exchange,提问作者user243724
相关产品推荐
相关产品推荐

