【发布时间】:2011-06-15 23:25:53
【问题描述】:
我有一个用 C# (.NET 4.0) 编写的 .NET 应用程序。在这个应用程序中,我们必须从文件中读取一个大型数据集并以网格状结构显示内容。因此,为了实现这一点,我在表单上放置了一个 DataGridView。它有 3 列,所有列数据都来自文件。最初,该文件有大约 600.000 条记录,对应于 DataGridView 中的 600.000 行。
我很快发现,DataGridView 在如此大的数据集下崩溃,所以我不得不切换到虚拟模式。为此,我首先将文件完全读入 3 个不同的数组(对应于 3 列),然后触发 CellValueNeeded 事件,我从数组中提供正确的值。
但是,正如我们很快发现的那样,此文件中可能有大量(大量!)记录。当记录大小非常大时,将所有数据读入数组或 List 等似乎是不可行的。我们很快就会遇到内存分配错误。 (内存不足异常)。
我们被困在那里,但后来意识到,为什么要先将数据全部读入数组,为什么不在 CellValueNeeded 事件触发时按需读取文件?所以这就是我们现在要做的:我们打开文件,但不读取任何内容,当 CellValueNeeded 事件触发时,我们首先将 Seek() 到文件中的正确位置,然后读取相应的数据。
这是我们能想到的最好的方法,但是,首先这非常慢,这使得应用程序运行缓慢并且对用户不友好。其次,我们不禁认为必须有更好的方法来实现这一点。例如,一些二进制编辑器(如 HXD)对于任何文件大小都非常快,所以我想知道如何实现这一点。
哦,为了增加我们的问题,在 DataGridView 的虚拟模式下,当我们将 RowCount 设置为文件中可用的行数(比如 16.000.000)时,DataGridView 甚至需要一段时间才能初始化本身。对于这个“问题”的任何 cmets 也将不胜感激。
谢谢
【问题讨论】:
标签: c# file-io datagridview large-data