将大量数据加载到List<;MyObject>;在.net中
本文关键字:gt MyObject net lt 加载 数据 List | 更新日期: 2023-09-27 17:58:12
我有一个C#工具,可以解析csv文件的集合来构建List。此集合可以是小到20个文件,也可以是大到10000+个文件。MyObject本身有大约20个属性,其中大多数是字符串。每个文件有时可以在列表中创建多达4个项目,有时多达300个。
解析完成后,我首先将列表保存到csv文件中,这样以后就不必重新分析数据了。然后,我通过数据集的一个枢轴来总结数据,然后用户可以选择数据集的多个枢轴。数据显示在WPF中,用户对数据进行操作,并用一些附加信息注释数据,然后将这些信息添加到MyObject中。最后,用户可以将所有这些信息保存到另一个csv文件中。
当文件变大时,我遇到了OOM,并优化了我的一些代码。首先,我意识到我存储了一个参数,即csv文件的路径,有时接近255个字符。我把它改为只保存文件名,情况略有改善。然后我发现了一个编译到x64的建议,它会给我4 Gb的内存,而不是2 Gb。
尽管如此,当越来越多的文件被添加到这个数据集中时,我显然还是遇到了OOM。
我考虑过的一些选项是:
-
解析文件时,请在每次解析文件后保存到intermediate.csv文件,不要将列表保存在内存中。这将使我避免在保存intermediate.csv文件之前看到OOM的步骤。这种方法的问题是,一旦解析完成,我仍然必须将中间文件加载回内存。
-
MyObject上的某些属性对于文件集合是类似的。因此,我考虑将单个对象重构为多个对象,这可能会减少List对象中的项目数量。本质上重构为List,其中MyTopLevelDetailsObject包含一个List。理论上,记忆足迹应该减少。然后,我可以通过做一些翻译将其输出到csv,使其看起来像一个单独的对象。
-
在内部将数据移动到类似MongoDB的数据库中,并将要汇总的数据加载到数据库逻辑中。
-
请改用DataTables。
选项2和3将是重大的重新设计,其中3还需要我学习MongoDB。:)
我正在寻找一些关于如何处理大型数据集的指导和有用提示。
谨致问候,LW
如果经过优化后,数据无法放入内存,那么根据定义,您几乎需要它来访问磁盘。
与其重新发明轮子并创建自定义数据格式,通常最好使用经过充分审查的解决方案。MongoDB是一个不错的选择,其他数据库解决方案也是如此。我喜欢SQLite,尽管它有名字,但它可以处理大量数据,而且不需要本地服务器。
如果您已经到了将数据拟合到本地磁盘上是一个问题的地步,您可能会考虑转向Hadoop这样的大数据解决方案。不过,这是一个更大的话题。
选项二和选项四可能对您没有帮助,因为(在我看来)它们不会减少内存中的信息总量。
还要考虑动态加载数据的选项。我的意思是,用户可能无法同时查看所有数据。因此,您可以将.csv的一部分加载到内存中,并将其显示给用户,然后如果用户进行了一些注释/编辑,则可以将此数据块保存到单独的文件中。如果用户滚动浏览数据,则可以动态加载数据。当用户想要保存final.csv时,您可以将其与原始.csv和您保存的小块相结合。
这通常是创建访问大量数据的C#桌面应用程序时的一种做法。例如,当我需要创建一个WinForms软件来操作一个巨大的数据库(行数超过1000万的表,它们无法容纳普通的办公电脑内存)时,我采用了动态加载数据块的方法。
是的,手动使用.csv做这件事的工作量太大了使用一些数据库更容易处理编辑部分的保存/保存/最终输出的组成。