我有一个非常大的数据集,我目前正在写一个文本文件(IO)。它非常缓慢,导致系统咀嚼了大量资源,因为有数十万行。
我想知道是否有人可以推荐一种好方法来减少系统负载,或者至少平滑过程以避免对内存资源的需求大幅增加等等。我不介意它是否意味着它需要更长的时间,但只要它不会给机器带来太多负荷。
答案 0 :(得分:2)
您的问题几乎没有意义,但假设您正在以块的形式从数据库中读取结果,您可以将它们以块的形式写入文件,以避免将整个数据集加载到内存中,就像这样:
using (var conn = new SqlConnection(SomeConnectionString))
using (var cmd = conn.CreateCommand())
{
conn.Open();
cmd.CommandText = "SELECT foo, bar FROM baz;";
using (var reader = cmd.ExecuteReader())
{
using (var writer = new StreamWriter("result.txt"))
{
while (reader.Read())
{
var foo = reader.GetString(reader.GetOrdinal("foo"));
var bar = reader.GetInt32(reader.GetOrdinal("bar"));
writer.WriteLine(string.Format("{0}, {1}", foo, bar));
}
}
}
}
就内存消耗而言,Rock'N'Roll和性能方面当然取决于SQL查询的优化和SQL服务器的功能。
答案 1 :(得分:1)
如果系统不依赖于此,您可以生成一个线程来进行实际写入并尝试批量/缓冲它以最小化CPU /内存峰值。这将取决于您的具体情况,并且您没有提供太多信息:)
答案 2 :(得分:1)
使用StreamWriter
来编写我最近写的300万行文件的文件,它看起来效果很好。确保您还在流中读取大量数据。
答案 3 :(得分:0)
在这种情况下,您不应将整个数据集加载到内存中。考虑到我使用NHibernate作为我的ORM,对于这种情况,我会从每个事务中一次100行的小批量读取数据库。这样,在任何给定时刻,我的内存只能容纳100行而不是100000,将100行写入文件,然后再次从数据库读取接下来的100行并写入文件等。
寻找分页。
答案 4 :(得分:-1)
写入文件的解决方案之一是使用log4Net写入文件。
这是有效的,而不是太多的资源。