【发布时间】:2015-07-29 13:16:01
【问题描述】:
我正在尝试操作已导入数据表的大量数据(1000 万条记录)。我不认为数据表是在内存中操作大量数据的最有效方式。有没有人有更好的方法来做到这一点?我正在尝试做的是获取 CSV 文件的内容来处理一些数据并将结果重新导出到另一个 CSV 文件中。
TIA, 保罗
【问题讨论】:
标签: c# performance datatable
我正在尝试操作已导入数据表的大量数据(1000 万条记录)。我不认为数据表是在内存中操作大量数据的最有效方式。有没有人有更好的方法来做到这一点?我正在尝试做的是获取 CSV 文件的内容来处理一些数据并将结果重新导出到另一个 CSV 文件中。
TIA, 保罗
【问题讨论】:
标签: c# performance datatable
DataTable 需要一次将整个内容加载到内存中。不要那样做。而是将输入和输出 csv 文件都视为流。这是一个非常好的 CSV 阅读器,可让您一次阅读和处理一条记录:
快速 CSV 阅读器
您想同时打开读取源和写入目标。当您从源读取一行时,对其进行处理,然后写入目标。您的内存中不应超过一行或几行。这在内存使用和性能方面都将更加高效。
为了获得更高的性能,您可以使用单独的读/写线程和生产者/消费者队列,但这需要更多的管理才能确保队列不会饱和,具体取决于具体情况和相对的读/处理/写性能,这种更复杂的解决方案可能根本不会提高性能。
【讨论】:
IDataReader 而不是DataTable,您将一次处理一行。一般来说,如果可能,请始终使用数据阅读器,并在不必要时避免使用数据表(但不要不惜一切代价避免,只要使用阅读器足够简单,或者如果您有大量数据)。