问题标签 [memory-mapped-files]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
5 回答
17294 浏览

c# - 如何动态扩展内存映射文件

我已经使用 C# 解决了以下要求.. - 创建一个可以快速接收大量数据的应用程序 - 您必须能够在收到更多数据时分析接收到的数据。- 使用尽可能少的 CPU 和磁盘

我对算法的想法是..

-> 使用之前的“房间/空间”时,磁盘上的大小以 10MB 为单位增加。

在 C# 中“将 mmf.size 增加 SIZE”是如何完成的?我找到了很多关于创建 mmfs 和视图的简单示例,但我看到的唯一地方(链接)实际上增加了 mmfs 区域的代码使用无法编译的代码。任何帮助将不胜感激。

编辑这会导致异常:

抛出此异常:该进程无法访问文件“C:\Users\moberg\Documents\data.bin”,因为它正被另一个进程使用。

0 投票
6 回答
14349 浏览

ios - 内存映射文件和低内存方案

iOS平台在低内存场景下如何处理内存映射文件?低内存场景是指操作系统向UIApplicationDidReceiveMemoryWarningNotification应用程序中的所有观察者发送通知时。

我们的文件使用 映射到内存中+[NSData dataWithContentsOfMappedFile:],文档说明:

映射文件使用虚拟内存技术来避免将文件的页面复制到内存中,直到实际需要它们。

这是否意味着操作系统也会在页面不再使用时取消映射它们?是否可以将页面标记为不再使用?如果这改变了场景,则此数据是只读的。如果我们mmap()直接使用呢?这会更好吗?

0 投票
2 回答
12057 浏览

c++ - boost::interprocess message_queue 性能 - 相当慢?

我需要一个超快的 MQ 机制,发送者和接收者都是在 Windows 平台上用 C++ 编写的。

我当前使用RCF-C++进行 IPC 的实现在 Windows 命名管道上的时钟速度约为 20,000 msg/sec。

我正在根据演示应用程序测试 boost::interprocess Message Queues 的性能,并且测量到大约 48,000 条消息/秒,考虑到当我在同一台机器上编写一个简单的内存映射文件通信时(在C# 使用此博客文章中的代码),我每秒收到大约 150,000 条消息。

关于为什么我从 boost message_queue 中获得如此缓慢的性能以及我可以尝试改进它的任何想法?

0 投票
1 回答
3099 浏览

windows - Windows:调整共享内存的大小

当我在 Windows 上创建共享内存段(如CreateFileMapping(INVALID_HANDLE_VALUE, ...))时,除了创建更大的段并复制数据之外,还有什么方法可以调整它的大小?

我在 MSDN 中读到文件映射具有固定大小,但是否有可能在同一内存上进行新映射?就像在 Linux 中一样,您可以在其中使用shm_open()然后再ftruncate()使用mmap()它。

0 投票
2 回答
1797 浏览

linux - 使用 mmap 分配 Emacs 缓冲区

为什么mmap在 cygwin、freebsd 和 irix6-5 上默认激活缓冲区分配,但在 linux 上没有?

USE_MMAP_FOR_BUFFERSemacs/src/config.h。并且use_mmap_for_buffersemacs/configure.in.

mmap基于访问不是优于普通缓冲区分配吗?

0 投票
2 回答
304 浏览

c# - 请求分块加载我的文件的方向(只需要建议)

在过去的几天里,我一直在研究一种方法,可以在保存时将我的 xna 游戏的 1.44 亿个图块表示压缩到一个非常小的尺寸。成功地实现了这一点后,我现在发现自己对如何将它们从文件中分块取回感到困惑。

在我拥有的文件中。

  1. 一个整数(使用 7BitEncodedInt 方法将其压缩为字节)
  2. 一个字节

压缩整数表示瓦片的数量,后面的字节确定瓦片的类型。这一切都很好,而且效果很好。最重要的是,它将文件大小平均缩小到 50mb。

问题是我目前正在读回整个文件。从文件中我得到了这个。

  1. 每个图块的索引值(只是我抓取图块时的基本迭代)
  2. 每个图块的类型为字节值
  3. 表示该图块纹理的字节值(这很难解释,但在每个图块的基础上都是必要的)

所有这一切的最终结果是我设法保存了文件并且只使用了大约 50mb。但是通过将整个东西重新加载进去,它会在内存上扩展到近 1.5gigs。我真的不能再牺牲瓷砖信息了。所以我需要一种仅根据玩家位置加载地图部分的方法。目标是在 100-200mb 范围内

我一直在研究内存映射文件,使用四叉树,几乎所有我能找到的用于分块加载文件的东西。虽然这些选项看起来都不错,但我不确定哪个是最好的,或者如果考虑到这种情况,可能还有另一个更好的选项。所有这一切的另一个问题是这些解决方案似乎都非常复杂(特别是因为这是我第一次使用它们),虽然我不反对将自己投入到一些冗长的编码中,但我想知道它会做什么我需要它在手之前。

我的问题是,考虑到我在拉入文件时必须如何处理文件,并且需要根据玩家的位置来完成它,那么最好的方法是什么?我只是在这里寻找一些方向。代码总是受欢迎的,但不是必需的。

0 投票
0 回答
231 浏览

file-io - 使用 MMF 时获取文件读取权限

我有两个过程。一个使用 .NET 4 MemoryMappedFiles 写入内存映射文件,另一个使用 .NET 3.5 (MONO) 中的 FileStream 读取文件。当我获得许可时一切正常,读取或写入文件没有问题。问题是获得许可。

编写 MMF(作家):

阅读MMF(阅读器):

首先我启动 Writer,然后是 Reader。

我使用这种幼稚的方法对其进行了测试:

大约 10 秒后,Reader 通常会获得许可,一切顺利。如果我捕捉到异常,它会抛出:

IOException:在 System.IO.FileStream..ctor 的路径 C:\path 上共享冲突(System.String 路径、FileMode 模式、FileAccess 访问、FileShare 共享、Int32 bufferSize、布尔匿名、FileOptions 选项)[0x00000] in :0

知道为什么这两个进程从一开始就不能正确共享文件吗?

0 投票
2 回答
3783 浏览

c# - 无法删除 MemoryMappedFile 的文件

以下代码引发此异常:

“该进程无法访问文件 '\filename',因为它正被另一个进程使用。”

很公平,但是关闭阅读器和/或 mmf 以便删除文件的正确方法是什么?我认为 MemoryMappedFile 会有一个 close() 方法或类似的方法,但它没有。

任何帮助将不胜感激。谢谢。

编辑:

看起来我只有在析构函数中遇到这个问题。当在其他地方调用 dispose() 时,它工作正常,但是当我执行以下操作时,它会引发异常。Reader 和 mmf 显然是该类的成员。输入构造函数后,文件访问是否隐含发生?

0 投票
1 回答
581 浏览

java - 在内存映射交换文件中移动内存

我正在尝试通过使用 MappedByteBuffer 对文件进行内存映射来为不同大小的位图设置交换文件。我希望能够在这个文件中移动内存,所以可能有两个子问题:

  • 有没有办法告诉 ByteBuffer 将内存块移动到另一个索引,或者
  • 是否可以直接访问原始映射内存来自己移动。
0 投票
1 回答
473 浏览

c++ - 在内存映射文件中交换字节的有效方法

通过将数据块读入内存并使用下面显示的函数交换大端整数,我设法解析了一个大型二进制文件(~8Gb)。但是,我试图通过使用Boost Memory-Mapped 文件来获得更多性能,但我无法使用 endian_swap 函数,因为该文件是以只读模式打开的。有没有什么有效的方法可以在不写入原始文件的情况下交换字节?如果不是,性能会受到 I/O 开销的影响吗?

代码在这篇文章中找到。非常感谢您的宝贵时间