gpt4 book ai didi

c# - 将 5000 万条记录保存到 CSV 文件,每个文件节省 20 万条记录

转载 作者:行者123 更新时间:2023-12-01 18:48:31 25 4
gpt4 key购买 nike

我有一个函数可以生成数字并将它们存储到 List<int> .
现在我必须尽快将这些结果存储到文件中。

这是迄今为止我的代码:

private void Save_Click(object sender, EventArgs e)
{
//this is just for tests
List<int> myResults = Enumerable.Range(1, 50000000).ToList();
const string dir = @"D:\TESTS";

int fileCount = 1;
var file = Path.Combine(dir, string.Format("{0}.csv", fileCount));
var sw = new StreamWriter(file, false);
int i = 0;

Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();

foreach (int res in myResults.Shuffle())
{
sw.WriteLine(res);
i++;
if (i%200000 != 0) continue;
fileCount++;
sw.Close();
file = Path.Combine(dir, string.Format("{0}.csv", fileCount));
sw = new StreamWriter(file, false);
}

sw.Close();
stopwatch.Stop();

label3.Text = string.Format("Save time(s): {0:0.##}", stopwatch.Elapsed.TotalSeconds);
}

Shuffle 是取自 this answer 的扩展方法.

public static class Extensions
{
public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> source, Random rng = null)
{
if (rng == null)
rng = new Random();

T[] elements = source.ToArray();
for (int i = elements.Length - 1; i > 0; i--)
{
int swapIndex = rng.Next(i + 1);
yield return elements[swapIndex];
elements[swapIndex] = elements[i];
}
yield return elements[0];
}
}

我的问题是,在我的电脑上保存大约需要 5-7 分钟,当我将结果数量增加到 1 亿时,我得到 OutOfMemoryException .

如何加快速度并消除该错误?

最佳答案

代码中最有问题的行是:

List<int> myResults = Enumerable.Range(1, 50000000).ToList();

和:

foreach (int res in myResults.Shuffle())

尽量避免在堆上创建 100m 个对象。相反,连续生成数据并立即将其写入磁盘,而不将其保留在内存中。否则内存管理和垃圾收集就会成为瓶颈。

并将洗牌移到定时代码之外。我很确定洗牌会消耗相当多的时间。

因此,目前您测量的是 .NET 垃圾收集和改组算法的效率,而不是您真正想要测量的,即写入 CSV 文件需要多长时间。

关于c# - 将 5000 万条记录保存到 CSV 文件,每个文件节省 20 万条记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33102555/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com