问题标签 [file-mapping]

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 投票
1 回答
449 浏览

c++ - 文件映射对象和文件对象可以互换使用吗?

假设我想为CreateFile函数生成一个包装函数

这个新函数不会在磁盘上生成真实文件,而是创建文件映射对象并返回新对象的句柄。

我查看了这个示例,创建命名共享内存,并尝试实现我的功能:

问题

这对我来说看起来不错,但是,当尝试使用返回HANDLEReadFile函数时,我得到错误代码 6The handle is invalid.

问题

文件映射对象和文件对象可以互换使用吗?如果是这样,那么我的代码有什么问题?如果没有,知道如何实现这样的功能吗?

0 投票
0 回答
192 浏览

visual-c++ - 如何使用 Visual C++ 在内存中分段映射大型文本文件?

我在磁盘上有一个大小为 20GB 的大型纯文本文件。让我们将此文件命名为“MyFile.txt”。该文件只包含英文单词和一个值为“+++”的字符串。让我们将此字符串命名为 FlagString。从 MyFile.txt 的开头到 FlagString 有正确的英文单词。让我们将这部分文件称为字典。但是从 FlagString 之后的第一个单词到 MyFile.txt 的结尾,这些单词可能有拼写错误。让我们将这部分文件称为 CheckedSection。我必须阅读检查部分中的每个单词并验证该单词的拼写,以按照某种算法将其与 Dictionary 中的适当单词进行比较。如果 MyFile.txt 很大,我想使用 CreateFileMapping 和 MapViewOfFile 函数将文件映射到内存中。我的问题如下:

  1. MyFile.txt 很大,所以我想将它片段映射到内存中。让每个片段的大小为 1GB。请帮助我如何使用 CreateFileMapping 在内存中映射文件碎片。
  2. 当我使用碎片文件映射到内存时,如何将 FlagString 识别为 Dictionary 和 CheckedSection 之间的分隔符。MyFile.txt 中的 FlagString 在 1GB 部分边界上可能不是强制性的,但它可能在 1GB 部分内。文件映射到内存后,是否有任何文件光标用于标记文件中的位置?
  3. 我可以从 MyFile.txt 创建两个内存映射吗?Dictionary 的一个映射和 CheckedSection 的另一个映射。
  4. 每次完成 Dictionary 或 CheckedSection 的当前 1GB 部分的处理后,我必须调用 UnmapViewOfFile 和 CloseHandle 吗?
0 投票
2 回答
1536 浏览

c++ - windows下如何正确使用共享内存

我对共享内存有点陌生,我正在寻找一个工作示例,我只能通过MSDN找到

在第一个进程中,我将共享内存声明如下:

在第二个过程中:

我知道一旦我完成了 mapView 的工作,我需要使用“ UnmapViewOfFile()”来释放它。我的问题是具体在哪里?

  1. 父进程?
  2. 子进程
  3. 两个都?

如果两者都存在,操作系统是否会在地址完全释放之前保留一些引用计数?

来自 MSDN:

它还会减少相应物理页面的共享计数

这让我对我实际上应该做什么有点困惑。

0 投票
5 回答
10137 浏览

c++ - CreateFileMapping,MapViewOfFile,处理泄漏 C++

背景:我正在尝试创建一个可由多个进程访问的内存映射文件。在下面的代码中,我只输入了与我目前必须使事情变得更简单的问题有关的代码。根据 msdn,我应该能够创建文件映射、映射文件视图并关闭从 CreateFileMapping 收到的句柄,并且 MapViewOfFile 将使我的 FileMap 保持活动状态。FileMap 应该仍然可以访问,直到我 UnmapViewOfFile。

MSDN: CreateFileMapping 函数

文件映射对象的映射视图维护对该对象的内部引用,并且文件映射对象在对它的所有引用都被释放之前不会关闭。因此,要完全关闭文件映射对象,应用程序必须通过调用 UnmapViewOfFile 取消映射文件映射对象的所有映射视图,并通过调用 CloseHandle 关闭文件映射对象句柄。这些函数可以按任何顺序调用。

问题:成功映射文件视图然后关闭 CreateFileMapping 接收到的句柄后,FileMap 不再存在(它应该仍然存在)并且我的 MemMapFileReader 能够创建一个错误为 0 的新映射。(当它应该接收错误 183 '已经存在')

不好的解决方案:不关闭句柄允许 MemMapFileReader 程序访问它,但会导致 MemMapFileCreator 中的句柄泄漏,因为在进程关闭之前,句柄永远不会关闭。

问题:我错过了什么或做错了什么?

MemMapFileCreator

MemMapFileReader

0 投票
1 回答
39 浏览

c - 为什么这个文件映射变量不被刷新到磁盘?

我最近意识到我的 C 技能有点生疏了,所以决定玩一下。不过,我只是遇到了一个奇怪的行为——我请求的文件映射内存似乎没有刷新变量ifs.free_space。结果是如果你不注释掉这两//root行,程序总是从ifs.free_space等于零开始。但是,将其注释掉会导致计数器被保存。这里发生了什么事?

0 投票
1 回答
2311 浏览

c - 使用 memcpy() 将一个文件的内容复制到另一个文件

我需要将 file1 上下文复制到 file2。这是我的文件 file1

文件2

所以我的resilt应该是file2

我必须使用mmapandmemcpy为此。所以在这里我做什么首先我打开两个文件

然后我映射我的文件

这是我的 memcpy

和我的主要

但在此之后,我的 file2 看起来像这样

为什么?怎么了?

0 投票
0 回答
707 浏览

python - 将内存文件传递给需要文件名的函数

我在 iOS 上使用 pythonista,虽然我希望这没关系。一些 lib 调用需要 json 文件的路径才能将内容呈现到表单/用户界面中。但是据我所知,没有 API 可以从变量中呈现 JSON 数据。我可以读入 JSON 数据并将其作为文件再次写出并使用该文件,一切正常。但是,我想要某种类型的虚拟文件名,它指向内存中可以传递给函数的文件对象。基本上,被调用的函数忽略了我提供的路径是内存文件句柄这一事实。我在这里搜索过,似乎这个主题没有很好地解决。或者我搜索不正确。我可以想象,这个功能非常好。

0 投票
1 回答
2525 浏览

c++ - 文件映射的工作原理

我正在编写一个需要遍历 40gb 大二进制文件的程序,但我只有 16gb 的物理 RAM。一位朋友告诉我,我可以使用文件映射来缓解这个问题。我了解如何创建文件映射读取文件映射句柄,以及文件映射如何将持久内存中的文件部分映射到不同的虚拟内存块以供读取。

所以如果我理解正确,我可以创建一个 10gb 的缓冲区,并将文件的前 10gb 读入这个缓冲区。但是当我必须读取文件上的 10gb 标记时,操作系统会自动为我获取另一个块,还是我必须在我的代码中手动这样做?

0 投票
1 回答
4456 浏览

c - MapViewOfFile 偏移量 - 如何使用它

开发游戏(PT 中的“jogo”),服务器最多可以同时托管 5 个游戏,客户端将通过映射内存访问这些游戏。

所以这就是我所拥有的:

服务器:

客户:

我尝试创建“sizeof(sJogo)*MAX_JOGOS”的视图,然后增加指针+=sizeof(sJogo) * index; 但没有成功,所以现在我求助于你,你能帮我学习使用偏移量吗?

我一直在不断地搜索,并在 stackoverflow 上找到了一个很好的例子,但它是 C++,我无法适应它。

高阶 DWORD 偏移量是 sizeof(sJogo) 正确的吗?但我不知道粒度是什么或如何将其应用于低阶 DWORD ......

你能帮助我吗?谢谢你。


编辑:

下面的代码在 i = 1 (NULL) 时返回,我做错了什么?


编辑2:

解决了上面的问题,在这里找到了解决方案:

https://msdn.microsoft.com/en-us/library/windows/desktop/aa366548%28v=vs.85%29.aspx

我没有考虑偏移量的分配粒度,这导致 MapViewOfFile 在第二次尝试时返回 NULL。

上面的链接显示了一个关于如何将其应用于偏移量的清晰示例。

0 投票
2 回答
3267 浏览

memory-management - 我如何知道linux进程的页面缓存大小

现在我可以通过 /proc/meminfo 知道系统的整体缓存页面,我是否可以进一步知道对于特定进程它消耗了多少页面缓存?我的第一个想法是在一个进程的 smaps 中添加所有 RSSes。还有什么建议吗?谢谢。