【发布时间】:2011-10-18 10:05:26
【问题描述】:
我有一个相当大的 XML 文件(大约 1-2GB)。
要求是将xml数据持久化到数据库中。 目前,这是通过 3 个步骤实现的。
- 尽可能读取内存占用少的大文件
- 从 xml 数据创建实体
- 使用 SqlBulkCopy 将创建的实体中的数据存储到数据库中。
为了获得更好的性能,我想创建一个生产者-消费者模型,其中生产者创建一组实体,例如一批 10K 并将其添加到队列中。消费者应该从队列中取出这批实体,并使用 sqlbulkcopy 持久化到数据库中。
谢谢, 悟空
void Main()
{
int iCount = 0;
string fileName = @"C:\Data\CatalogIndex.xml";
DateTime startTime = DateTime.Now;
Console.WriteLine("Start Time: {0}", startTime);
FileInfo fi = new FileInfo(fileName);
Console.WriteLine("File Size:{0} MB", fi.Length / 1048576.0);
/* I want to change this loop to create a producer consumer pattern here to process the data parallel-ly
*/
foreach (var element in StreamElements(fileName,"title"))
{
iCount++;
}
Console.WriteLine("Count: {0}", iCount);
Console.WriteLine("End Time: {0}, Time Taken:{1}", DateTime.Now, DateTime.Now - startTime);
}
private static IEnumerable<XElement> StreamElements(string fileName, string elementName)
{
using (var rdr = XmlReader.Create(fileName))
{
rdr.MoveToContent();
while (!rdr.EOF)
{
if ((rdr.NodeType == XmlNodeType.Element) && (rdr.Name == elementName))
{
var e = XElement.ReadFrom(rdr) as XElement;
yield return e;
}
else
{
rdr.Read();
}
}
rdr.Close();
}
}
【问题讨论】:
-
我尝试使用 Thread 本地存储,但到目前为止,我只使用单线程方法,即调用一个方法来创建实体,然后将它们同步持久化。
标签: c# multithreading .net-4.0 task-parallel-library