我有一个用C# (.NET 4.0)编写的.NET应用程序。在这个应用程序中,我们需要从文件中读取大量数据集,并在类似于网格的结构中显示内容。因此,为了实现这一点,我在窗体上放置了一个DataGridView。它有3列,所有列数据都来自文件。最初,文件中有约600,000条记录,对应于DataGridView中的600,000行。
我很快发现,当数据集很大时,DataGridView会崩溃,因此我必须切换到虚拟模式。为了实现这一点,我首先将文件完全读入3个不同的数组(对应于3个列),然后当CellValueNeeded事件触发时,我从数组中提供正确的值。
然而,这个文件可能有很多(非常多!)记录,正如我们很快发现的那样。当记录大小非常大时,将所有数据读入数组或List<>等中似乎是不可行的。我们很快遇到了内存分配错误(Out of memory exception)。
我们陷入了困境,但随后意识到,为什么要先将数据全部读入数组中,而不是在CellValueNeeded事件触发时按需读取文件呢?所以现在我们的做法是:我们打开文件,但不读取任何内容,当CellValueNeeded事件触发时,我们首先使用Seek()方法定位到文件中的正确位置,然后读取相应的数据。
这是我们能想到的最好的方法,但首先它非常慢,使应用程序变得迟缓且不友好。其次,我们无法不考虑是否有更好的方法来实现这一点。例如,某些二进制编辑器(如HXD)对于任何文件大小都非常快,因此我想知道如何实现这一点。
哦,还有一个问题,即在DataGridView的虚拟模式下,当我们将RowCount设置为文件中可用的行数(例如16,000,000行)时,DataGridView甚至需要一段时间才能初始化自身。对于这个“问题”,任何意见都将不胜感激。
谢谢
我很快发现,当数据集很大时,DataGridView会崩溃,因此我必须切换到虚拟模式。为了实现这一点,我首先将文件完全读入3个不同的数组(对应于3个列),然后当CellValueNeeded事件触发时,我从数组中提供正确的值。
然而,这个文件可能有很多(非常多!)记录,正如我们很快发现的那样。当记录大小非常大时,将所有数据读入数组或List<>等中似乎是不可行的。我们很快遇到了内存分配错误(Out of memory exception)。
我们陷入了困境,但随后意识到,为什么要先将数据全部读入数组中,而不是在CellValueNeeded事件触发时按需读取文件呢?所以现在我们的做法是:我们打开文件,但不读取任何内容,当CellValueNeeded事件触发时,我们首先使用Seek()方法定位到文件中的正确位置,然后读取相应的数据。
这是我们能想到的最好的方法,但首先它非常慢,使应用程序变得迟缓且不友好。其次,我们无法不考虑是否有更好的方法来实现这一点。例如,某些二进制编辑器(如HXD)对于任何文件大小都非常快,因此我想知道如何实现这一点。
哦,还有一个问题,即在DataGridView的虚拟模式下,当我们将RowCount设置为文件中可用的行数(例如16,000,000行)时,DataGridView甚至需要一段时间才能初始化自身。对于这个“问题”,任何意见都将不胜感激。
谢谢