我需要建议。我有应用程序导入10,000行包含name&从文本文件到XElements的地址,随后将其添加到同步队列中。导入完成后,应用程序会生成处理XElements的工作线程,这些线程通过对它们进行取消,进行数据库调用,将数据库输出插入请求文档并将处理后的文档插入到输出队列中。处理完所有请求后,输出队列将作为XML文档写入磁盘。

我将XElements用于请求,因为我需要在处理过程中灵活地向请求添加字段。即根据作业类型,应用程序可能要求它根据与公共记录数据库的名称/地址匹配,将请求的电话号码,出生日期或电子邮件地址添加到请求中。

我的问题是; XElements似乎使用了相当多的内存,我知道有很多解析,因为文档通过处理方法。我正在考虑用Dictionary对象替换XElements,但我怀疑获得的收益是值得的。从本质上讲,它将完成同样的事情。

思想?

有帮助吗?

解决方案

所以你实际上并没有使用任何XML?您只是使用 XElement 作为名称/值对的集合?如果是这样,我肯定会使用字典。我希望您的代码也可能更清晰。

另一方面,如果你真的使用XML,你可能想要坚持使用 XElement

你真的有问题吗?你说它耗费了相当多的内存 - 你有足够的内存吗?你能买更多的记忆吗?如果只是为了节省内存,这几乎肯定会比花费几个小时的重构更便宜。 (听起来这个应用程序只在一个盒子上运行 - 我可能是错的。它的部署越广泛,花一些时间优化它就越有意义。)

编辑:好的,所以购买更多内存并不可行。即便如此,你真的有问题吗?这可能会使用更多的内存而不是它需要的影响是什么?什么是真的花费你?

其他提示

如果您可以避免在使用之前存储整个树,那么使用LINQ是有意义的。

我会考虑在每行构建查询时尽可能多地进行处理。

然后获取查询结果,然后处理它们,将结果存储在数据库中。

这将减少内存问题,因为每行只在需要时读入,然后进行处理和保存。

您可能会觉得这很有帮助: http:// www.onedotnetway.com/tutorial-reading-a-text-file-using-linq/

获取查询结果,对每个客户执行for循环并保存记录:

var query =
        from c in
            (from line in File.ReadAllLines(filePath)
             let customerRecord = line.Split(',')
             select new Customer()
                 {
                     Firstname = customerRecord[0],
                     Lastname = customerRecord[1],
                     PhoneNumber = customerRecord[2],
                     City = customerRecord[3],
                     Country = customerRecord[4]
                 })
        where c.Country == "UK"
        select c;
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top