.net 从数据库读取并写入文件

.net 从数据库读取并写入文件,.net,asp.net,visual-studio,file-io,.net,Asp.net,Visual Studio,File Io,场景-数据库中有大量数据。实用程序使用datareader逐个读取记录,并将其附加到txt/xml文件中。最初实用程序用于读取一条记录,然后将其写入文件;然后我对其进行了更改,以便读取大约10k条记录并将其放入内存(stringbuilder),然后刷新到文件中,等等。时间缩短得非常好 所以,我想文件i/O是瓶颈。我想进一步改进它。考虑使用某种类型的缓冲区,然后使用一个线程从DB读取并放入缓冲区,另一个线程从缓冲区提取并写入文件 有可能吗。从哪里开始? 有更好的选择吗?一个起点是使用两个缓冲区,

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

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

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

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

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

重复此操作直到完成。

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

大概

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

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

首先-您读取数据的速度有多快,写入数据的速度有多快?您当前的吞吐量是多少?大约有.40万条记录-读取单个记录,写入文件(耗时6分钟),读取10k条记录,写入文件(耗时1分钟40秒),读取20k条记录,写入文件(耗时1分钟50秒),读取两倍记录的速度稍微慢一些-很有趣。安装成本一定很大。这会让您知道是否可以通过使用多个线程进行改进。当然,编写过程必须在单个线程中完成,因此wach必须等待前一个线程,可能需要锁定该部分。实现这一点应该很简单,看看它能带来多大的不同。