【问题标题】:Reading from DB and Writing to File从数据库读取并写入文件
【发布时间】:2011-07-13 08:09:00
【问题描述】:

场景 - 数据库中有大量数据。实用程序使用 datareader 逐一读取记录并附加到 txt/xml 文件。最初用于读取一条记录的实用程序,将其写入文件;然后我对其进行了更改,以便读取大约 10k 条记录并将其放入内存(字符串生成器),然后刷新到文件等等。时间缩短非常棒。

所以,我猜文件 I/O 是瓶颈。我想进一步改进它。考虑使用某种缓冲区,然后使用一个线程从 DB 读取并放入缓冲区,另一个线程从缓冲区获取并写入文件。

有没有可能。从哪儿开始? 有更好的选择吗?

【问题讨论】:

  • 首先——读取数据的速度有多快,写入数据的速度有多快?您当前的吞吐量是多少?
  • 大约 40 万条记录 - 读取单条记录,写入文件(耗时 - 6 分钟), - 读取 10k 条记录,写入文件(耗时 - 1 分钟 40 秒), - 读取 20k 条记录,写入归档(耗时 - 1 分 50 秒)
  • 读取两倍的记录速度稍慢 - 有趣。那里一定有很大的设置成本。

标签: .net asp.net visual-studio file-io


【解决方案1】:

一个起点是使用两个缓冲区,并将缓冲区内容异步写入文件。比如:

buffera
bufferb
currentbuffer=buffera

fill currentbuffer with data
kickoff job to write currentbuffer to file
wait for previous write job to finish, if relevant.    
currentbuffer=otherbuffer

重复直到完成。

【讨论】:

  • 这应该让您了解是否可以通过使用多个线程来改进。当然,写入过程必须在单个线程中完成,因此 wach 将不得不等待前一个线程 - 可能会锁定该部分。实现这一点应该很简单,看看它有多大的不同。
【解决方案2】:

如果您真的需要更好的性能,您可以像今天一样以 10k 为单位读取数据,将开始/结束值传递给数据库,并使用多个线程同时将它们写入单独的文件。完成后,您连接/合并/附加文件。写入单个文件只能有这么大的改进,因为数据写入必须是顺序的。

类似的,

using (var output = File.Create("output"))
{
    foreach (var file in new[] { "file1", "file2" })
    {
        using (var input = File.OpenRead(file))
        {
            input.CopyTo(output);
        }
    }
}

不确定它是否真的能大幅度提高性能,但值得一试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 2021-09-11
    相关资源
    最近更新 更多