You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 04:43:21