内存映射文件到 WPF 网格
Memory Mapped File into a WPF grid
我正在通过内存映射文件 (C# MemoryMappedFile) 处理一个大文件 (8 GB)。我希望能够将内容放入 WPF 网格(例如数据网格),但我遇到了麻烦,因为每种似乎有效的方法都必须将文件加载到内存中,这会破坏内存映射文件的意义.
我知道 wpf 数据网格只能访问所需的数据,但我如何 link 将其添加到内存映射文件,以便我可以只请求正在查看的字节,而不必将其放入整件事都记在了记忆里。
我希望有一个像 datagrid.itemsource = file 这样的简单方法,但事实并非如此。
我的最终目标是加载这个大文件并显示文件的字节,就像十六进制编辑器一样。有人有使用内存映射文件或仅从用户正在查看的文件中读取字节的示例吗?
我将尝试向您简要概述如何完成此操作。您将需要 UI 虚拟化和数据虚拟化。 UI 默认 DataGrid (VirtualizingStackPanel) 中的虚拟化是免费的,对于数据虚拟化,您必须使用自定义解决方案(示例:https://alphachitech.wordpress.com/2015/01/31/virtualizing-observable-collection/)。每个项目将代表 1MB 的原始数据,因此您的网格中总共将有大约 8000 个这样的项目。最初 none 这些项目实际上包含数据。只有当用户向下滚动到文件的那部分时,才会从内存映射文件中读取数据(参见上面的数据虚拟化)。这将允许用户滚动整个 8GB 的文件,就像它加载到内存中一样,而真正的 1MB 块将在他滚动时加载和卸载。
我正在通过内存映射文件 (C# MemoryMappedFile) 处理一个大文件 (8 GB)。我希望能够将内容放入 WPF 网格(例如数据网格),但我遇到了麻烦,因为每种似乎有效的方法都必须将文件加载到内存中,这会破坏内存映射文件的意义.
我知道 wpf 数据网格只能访问所需的数据,但我如何 link 将其添加到内存映射文件,以便我可以只请求正在查看的字节,而不必将其放入整件事都记在了记忆里。
我希望有一个像 datagrid.itemsource = file 这样的简单方法,但事实并非如此。
我的最终目标是加载这个大文件并显示文件的字节,就像十六进制编辑器一样。有人有使用内存映射文件或仅从用户正在查看的文件中读取字节的示例吗?
我将尝试向您简要概述如何完成此操作。您将需要 UI 虚拟化和数据虚拟化。 UI 默认 DataGrid (VirtualizingStackPanel) 中的虚拟化是免费的,对于数据虚拟化,您必须使用自定义解决方案(示例:https://alphachitech.wordpress.com/2015/01/31/virtualizing-observable-collection/)。每个项目将代表 1MB 的原始数据,因此您的网格中总共将有大约 8000 个这样的项目。最初 none 这些项目实际上包含数据。只有当用户向下滚动到文件的那部分时,才会从内存映射文件中读取数据(参见上面的数据虚拟化)。这将允许用户滚动整个 8GB 的文件,就像它加载到内存中一样,而真正的 1MB 块将在他滚动时加载和卸载。