我有一个用 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 甚至需要一段时间才能初始化自身。对此“问题”的任何评论也将不胜感激。
谢谢