gpt4 book ai didi

c# - 数据库表的低内存遍历

转载 作者:太空宇宙 更新时间:2023-11-03 18:40:10 26 4
gpt4 key购买 nike

我有一个数据库,其中包含大量带有日期/时间戳记的记录。我需要遍历这些记录(按时间顺序)并对它们进行一些分析。

数据库太大,一次拉不下每条记录,所以我想一次拉几个星期/天/小时/等等。我遇到的问题是,无论我尝试过什么,数据库 (SQL Server) 都会使用我机器上的所有内存。即使在应用程序关闭后,sqlservr.exe 仍在使用我的所有内存。它通常使用大约 1.8 GB 的内存,无论我的“批处理”仅包含 10 条记录还是 1,000,000 条记录。

问题是:我怎样才能一次查询数据库以获取“成批”记录,而不让数据库消耗每一点内存?

我正在使用 System.Data.SqlClient 库。这是一些伪代码:

String file = "C:\\db.mdf";
String connString = @"Data Source=.\SQLExpress;AttachDbFilename="C:\db.mdf";Integrated Security=True;User Instance=True";

SqlConnection conn = new SqlConnection(connString);
conn.Open();

DateTime start = DateTime.MinValue;
DateTime end = DateTime.MaxValue;

while()
{
// This should query for 1 hour at a time (but I should be able to change the time interval)
// I would like for the memory usage to be proportional to the time interval

String query = "SELECT * From MyTable WHERE Date BETWEEN '" + start.ToString() + "' AND '" + end.ToString() + "'";
SqlCommand cmd = new SqlCommand(query, conn);
SqlDataReader reader = command.ExecuteReader();

while(reader.Read())
ProcessRecord(ref reader);

start = end;
end = end.AddHours(1);
}

conn.Close();

C#
.NET 3.5
SQL 服务器 2008

谢谢。

最佳答案

这是正常的,SQL Server 将使用所有可用内存unless configured differently .

当您的其他应用程序请求更多内存时,Sql Server Express 将释放内存,但它会尝试使用所有可能的内存来缓存查询计划和数据。

引用链接文章:

The following example sets the max server memory option to 4 GB:

 exec sp_configure 'show advanced options', 1; 
GO
RECONFIGURE;
GO
exec sp_configure 'max server memory', 4096;
GO
RECONFIGURE;
GO
exec sp_configure 'show advanced options', 0;
RECONFIGURE;
GO

请注意SqlConnectionSqlCommandSqlDataReader 实现了IDisposable,所以您通常希望将它们包装在 using 子句中。

关于c# - 数据库表的低内存遍历,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9789486/

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