0

我需要建议。我的应用程序将 10,000 行包含名称和地址的文本文件从文本文件导入 XElement,随后将其添加到同步队列中。导入完成后,应用程序会生成处理 XElement 的工作线程,方法是使它们出列、进行数据库调用、将数据库输出插入请求文档并将处理后的文档插入输出队列。处理完所有请求后,输出队列将作为 XML 文档写入磁盘。

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

我的问题是;XElements 似乎使用了相当多的内存,我知道在文档通过处理方法时需要进行大量解析。我正在考虑将 XElements 替换为 Dictionary 对象,但我怀疑这样做是否值得。从本质上讲,它会完成同样的事情。

想法?

4

2 回答 2

1

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

另一方面,如果您真正使用 XML,您可能希望坚持使用XElement.

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

编辑:好的,所以购买更多内存并不可行。即便如此,你真的有问题吗?这可能使用比它需要的更多的内存有什么影响?真正让你付出了什么?

于 2009-09-12T16:47:48.700 回答
0

如果您可以避免在使用之前存储整个树,那么使用 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;
于 2009-09-12T17:03:48.823 回答