内存映射文件到WPF网格

时间:2016-03-31 19:16:58

标签: c# wpf datagrid large-files memory-mapped-files

我正在通过内存映射文件(C#MemoryMappedFile)处理大文件(8 GB)。我希望能够将内容放入WPF网格(例如数据网格),但我遇到了麻烦,因为似乎有效的每种方法都必须将文件加载到内存中,这会破坏内存映射文件的点。

我知道wpf数据网格只能访问所需的数据,但我如何将其链接到内存映射文件,以便我只能请求正在查看的字节,而不必将整个内容放入内存。

我希望有一种像datagrid.itemsource = file这样的简单方法,但看起来并非如此。

我的最终目标是加载这个大文件并显示文件的字节,就像十六进制编辑器一样。任何人都有一个使用内存映射文件的例子或只读取用户正在查看的文件的字节?

1 个答案:

答案 0 :(得分:0)

我将尽力为您提供如何完成此操作的高级概述。您将需要UI虚拟化和数据虚拟化。您在默认DataGrid(VirtualizingStackPanel)中免费获得UI虚拟化,对于数据虚拟化,您必须使用自定义解决方案(例如:https://alphachitech.wordpress.com/2015/01/31/virtualizing-observable-collection/)。每个项目代表1MB的原始数据,因此您的网格中总共有大约8000个这样的项目。最初,这些项目中没有一个实际包含数据。当用户向下滚动到文件的该部分时,仅从内存映射文件中读取数据(请参阅上面的数据虚拟化)。这将允许用户滚动整个8GB文件,就像它在内存中加载一样,而在滚动时真正加载和卸载1MB块。