内存映射文件到 WPF 网格

Posted

技术标签:

【中文标题】内存映射文件到 WPF 网格【英文标题】:Memory Mapped File into a WPF grid 【发布时间】:2016-03-31 19:16:57 【问题描述】:

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

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

我希望有一个简单的方法,比如 datagrid.itemsource = file,但事实并非如此。

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

【问题讨论】:

为什么要使用DataGrid?您将在列中显示什么? 列将是动态的以创建字节行。类似于大多数十六进制编辑器 【参考方案1】:

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

【讨论】:

这正是我所需要的。我按照他们的例子,我能够以最小的影响(10-20MB)显示大文件 这正是我所需要的。我按照他们的例子,我能够以最小的影响(10-20MB)显示大文件

以上是关于内存映射文件到 WPF 网格的主要内容,如果未能解决你的问题,请参考以下文章

linux中匿名内存映射映射到哪个文件?

内存映射文件

高效率场景-内存映射

将几个大文件映射到内存中

八文件IO——存储映射

如何将文件映射到内存?