问题标签 [mmap]
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.
c++ - mmap() 与读取块
我正在开发一个程序,该程序将处理大小可能为 100GB 或更大的文件。这些文件包含可变长度记录集。我已经启动并运行了第一个实现,现在正在寻求提高性能,特别是在更有效地执行 I/O 方面,因为输入文件被扫描了很多次。
mmap()
是否有使用与通过 C++ 库读取块的经验法则fstream
?我想做的是将大块从磁盘读取到缓冲区中,处理缓冲区中的完整记录,然后读取更多。
mmap()
代码可能会变得非常混乱,因为' mmap
d 块需要位于页面大小的边界上(我的理解),并且记录可能会跨越页面边界。使用fstream
s,我可以寻找记录的开头并再次开始阅读,因为我们不限于阅读位于页面大小边界上的块。
在没有实际编写完整实现的情况下,如何在这两个选项之间做出决定?任何经验法则(例如,mmap()
快 2 倍)或简单测试?
c - 什么时候应该使用 mmap 进行文件访问?
POSIX 环境至少提供两种访问文件的方式。有标准的系统调用open()
, read()
, write()
, 和朋友,但也有mmap()
用于将文件映射到虚拟内存的选项。
什么时候最好使用其中一种?包括两个接口的优点是什么?
java - 在 jvm 中缓存一个 tar 以获得更快的文件 I/O?
我正在开发一个 Java Web 应用程序,该应用程序使用数千个小文件来构建工件以响应请求。我认为如果我们可以将这些文件映射到内存而不是在整个磁盘上运行以一直查找它们,我们的系统可以看到性能改进。
我听说过 linux 中的 mmap,我对这个概念的基本理解是,当从磁盘读取文件时,文件的内容会缓存在内存中的某个位置,以便更快地进行后续访问。我的想法类似于这个想法,除了我想将整个可 mmap 的文件集读入内存,因为我的 Web 应用程序正在初始化以实现最小的请求时间响应。
我的思路的一个方面是,如果将文件全部打包并以某种方式作为虚拟文件系统安装在 JVM 中,我们可能会更快地将文件放入 jvm 内存。就目前而言,我们当前的实现可能需要几分钟才能遍历源文件集并找出磁盘上的所有内容。这是因为我们实际上是在对超过 300,000 个文件进行文件统计。
我找到了可以从 tar 文件中读取信息的 apache VFS 项目,但是我不确定他们的文档中是否可以指定诸如“另外,将整个 tar 读入内存并将其保存在那里..”之类的内容。
我们在这里谈论的是一个多线程环境,该环境服务于通常将一整套 300,000 多个源文件中的大约 100 个不同文件拼凑在一起以做出一个响应的工件。所以无论虚拟文件系统解决方案是什么,它都需要是线程安全的和高性能的。我们在这里只讨论读取文件,没有写入。
此外,我们正在运行具有 32 GB RAM 的 64 位操作系统,我们的 300,000 个文件占用大约 1.5 到 2.5 GB 的空间。我们肯定可以将 2.5 GB 的文件读入内存比 300K 的几 KB 大小的小文件快得多。
感谢您的输入!
- 杰森
php - 在 FastCGI 下运行时,如何在多个 PHP 进程之间共享 APC 缓存?
我目前正在运行多个 PHP/FastCGI 副本,并启用了 APC(在 Apache+mod_fastcgi 下,如果重要的话)。我可以在进程之间共享缓存吗?如何检查它是否已经共享?(我认为apc.mmap_file_mask
可能涉及ini设置,但我不知道如何使用它。)
(我认为它目前不共享的原因之一是apc.mmap_file_mask
,正如 apc.php Web 界面所报告的那样,当我重新加载时,它会在大约 3 个不同的值之间翻转。)
c - mmap 保护标志对进程间共享的影响
保护标志会影响进程之间的共享吗?如果我有 PROT_READ|PROT_WRITE 保护的映射内存区域,只要我没有写入它,它是否仍然完全共享?
与:
我想在映射后对内存区域的一小部分进行小修改,然后重新保护它,因为它比在我需要时保护小部分更简单。
问题是它最终是强制每个进程复制整个文件还是只是我在每个进程中修改的部分?
c++ - 将指针传递给使用 exec() 生成的进程
我想向使用 fork + exec 生成的进程传递一个指针(我正在使用 mmap 将一个包含数据的文件放入内存中),但我被困在如何将指针传递给 exec() 生成的进程?
更新1:
感谢您的输入,我确实使用共享内存使用带有 MAP_INHERIT 标志的 mmap 创建它:
使用 mmap() 函数创建的每个映射文件和共享内存区域都会通过成功调用任何 exec 函数来取消映射,使用 MAP_INHERIT 选项映射的区域除外。使用 MAP_INHERIT 选项映射的区域仍然映射在新的过程映像中。
来源:http ://www.uwm.edu/cgi-bin/IMT/wwwman?topic=exec(2)&msection=
更新2:
这是家庭作业练习,但我认为我必须停止考虑指针并考虑 IPC 本身。我想我会尝试在子进程中映射同一个文件。
非常感谢短代码示例。
在此先感谢您的帮助。
gdb - 使用 GDB 检查映射地址
我正在使用我在 Linux 的 Direct Memory Access 上发布的驱动程序将一些物理内存映射到用户空间地址。但是,我不能使用 GDB 查看任何地址;即,x 0x12345678(其中 0x12345678 是 mmap 的返回值)失败并出现错误“无法访问地址 0x12345678 处的内存”。
有没有办法告诉GDB这个内存可以查看?或者,我可以在 mmap 中做一些不同的事情(调用或 foo_mmap 那里的实现)允许它访问这个内存吗?
请注意,我不是在询问 /dev/mem(如第一个片段中那样),而是询问通过 ioremap()、virt_to_phys() 和 remap_pfn_range() 获取的内存的 mmap
mmap - 内存映射文件可以有多大?
什么限制了内存映射文件的大小?我知道它不能大于未分配地址空间的最大连续块,并且应该有足够的可用磁盘空间。但是还有其他限制吗?
c - Using mmap over a file
I'm trying to allow two different processes to communicate by using memory mapping the same file. However, I'm having some problems with this. I have a feeling this has to do with the way I'm using the open() call and passing my file descriptor to mmap.
Here is my code, can you see anything wrong with it?
Object 1's code:
I use the "w" file mode since Object 1 will only ever be made once and I want it to reset any previously existing data.
Object 2's Code:
linux - Linux MMAP 内部结构
我有几个关于mmap
Linux 系统中的实现的问题,这些问题似乎没有太多记录:
使用 将文件映射到内存mmap
时,您将如何处理预取此类文件中的数据?
即当您从映射区域读取数据时会发生什么?该数据是否已移至 L1/L2 缓存?它是直接从磁盘缓存中读取的吗?prefetchnta
和类似的 ASM 指令是否适用于mmap
ed 区域?
实际mmap
调用的开销是多少?它是相对于映射数据的数量还是常数?
希望有人对此有所了解。提前致谢。