将非常大的数据集写入文本文件

时间:2011-09-13 23:40:38

标签: c# io

我有一个非常大的数据集,我目前正在写一个文本文件(IO)。它非常缓慢,导致系统咀嚼了大量资源,因为有数十万行。

我想知道是否有人可以推荐一种好方法来减少系统负载,或者至少平滑过程以避免对内存资源的需求大幅增加等等。我不介意它是否意味着它需要更长的时间,但只要它不会给机器带来太多负荷。

5 个答案:

答案 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写入文件。

这是有效的,而不是太多的资源。