我的Windows服务正在读取100个文件,每个文件中有数千条记录,并使用线程插入Sql服务器。目前我是如何使用Threads
来实现这一点的。我正在运行4个线程,每个Thread
将选择一个文件并处理,直到文件结束,然后我将所有读取的记录插入数据库。然后此线程将拾取新的未处理文件。所有4个线程的行为都相同。但这个过程需要很长时间。
有没有更好的方法来实现这一点。
我需要比现在更快地完成这个操作。
如果您只是导入数据,那么最好执行BULK INSERT。
此外,如果您有多个线程同时从同一个磁盘读取,那么您的程序可能会比单线程运行时慢。如果每条记录的处理时间非常短,则情况尤其如此。你最好只使用两个线程,像这样。
while not end of input
{
read a batch of records from the disk
wait for pending asynchronous SQL insert operation to complete
start asynchronous SQL insert operation with
}
因此,当一个线程插入记录时,主线程正在从磁盘中读取下一批记录。
如果有多个线程从磁盘中读取,那么这些线程将花费大量时间在硬件上等待。磁盘一次只能做一件事,并且磁盘查找不是空闲的。此外,根据数据库服务器的不同,在多个线程执行插入操作时,它的执行速度可能比在单个线程执行插入时慢。
实际上,如果插入只是磁盘文件的导入,那么BULK insert几乎肯定会比C#程序执行得更快。