gpt4 book ai didi

c# - 缓冲与流式传输大型数据集

转载 作者:行者123 更新时间:2023-11-30 20:59:06 26 4
gpt4 key购买 nike

我需要将 10,000 到 20,000 个独特的过滤器应用于 5000 万行、8 列和适当索引的数据集。

我目前的方法是动态生成并一次执行这些查询:

var stats = (from a in db.AggregatedStats
where a.StatType.StartsWith("TOTAL_ITEM")
select a);

// Add more filters to the WHERE clause

foreach (var stat in stats) { // Process the data }

我相信这种方法被称为从 SQL Server 到 MoveNext() 的“流”数据。

将数据缓冲到程序内存中会更有效吗?

var stats = (from a in db.AggregatedStats
where a.StatType.StartsWith("TOTAL_ITEM")
select a).ToList();

然后将过滤器应用于此实体列表:

var result = (from a in stats
where a.Region.Equals(region)
select a);

这将有效地将 SQL Server 查询的数量从 10,000 减少到 1。

在这种情况下,与从 10,000 个查询流式传输数据所花费的时间相比,将数据集缓冲到程序中是否值得额外的 RAM?

谢谢!

最佳答案

否定的。将数据库中的枚举推迟到可能的最后一秒,这样可以避免将即将失效的数据推送到内存中(这只会增加用于此应用程序的内存)。这是您当前示例使用的方法(因为在 foreach 启动之前它实际上不会被调用)并且应该是最高性能的。

我想你可能会感到困惑;当你写

var stats = (from a in db.AggregatedStats
where a.StatType.StartsWith("TOTAL_ITEM")
select a);

实际上什么都没有发生 - stats 只是包含一个知道如何获取数据的迭代器,直到您调用 ToList() 或使用 枚举该查询>foreach,实际上没有请求任何东西,这就是你获得性能的原因。

关于c# - 缓冲与流式传输大型数据集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15624796/

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