在这个线程中,OPbuild议使用mmap()而不是shmget()来获得Linux中的共享内存。 我访问了这个页面和这个页面来获取一些文档,但是第二个文档给出了关于mmap()一个模糊的例子。 作为一个新手,并且需要在两个进程之间共享一些信息(文本forms),我应该使用shmget()方法还是使用mmap() ? 为什么? 谢谢, 短发
我有一个程序,映射不less(100)的大文件每个10-100MB。 我需要他们全部映射在同一时间。 目前我open电话,然后在节目开始时按mmap ,然后是munmap ,最后close 。 通常我必须在运行程序之前调整运行ulimit -n的打开文件限制。 问题是我真的需要保持文件打开,或者我可以open mmap close做一些大数据处理,然后munmap当我完成。 这个mmap的man页面对我来说似乎不太清楚。
我有一个Linux应用程序,并行读取150-200文件(4-10GB)。 每个文件依次以小的,可变大小的块来读取,通常每个小于2K。 我目前需要保持超过200MB / s的读取速率,这些文件组合在一起。 磁盘处理这很好。 预计需求超过1 GB / s(目前超出磁盘范围)。 我们已经实现了两个不同的读取系统,都使用posix_advise :首先是一个mmap ed读取,我们映射整个数据集和按需阅读。 第二个是基于read() / seek()的系统。 这两个工作正常,但只适用于温和的情况下, read()方法更好地pipe理我们的整体文件caching,可以很好地处理100 GB的文件,但速度有限, mmap可以预caching数据,使持续数据速率超过200MB / s容易维护,但不能处理大的总数据集大小。 所以我的问题来到这些: 答:可以将read()types的文件I / O进一步优化,超出了Linux上的posix_advise调用,或者调整了磁盘调度程序,VMM和posix_advise调用是否如我们所期望的那样好? B:有没有系统的方法让mmap更好地处理非常大的映射数据? Mmap-vs-reading-blocks与我正在工作的是类似的问题,并为此问题提供了一个很好的起点,以及mmap-vs-read中的讨论。
[编辑:这个问题只适用于32位系统。 如果你的计算机,你的操作系统和你的python实现是64位的,那么mmap-large文件的工作是可靠的,效率非常高。 我正在写一个模块,其中包括允许按位读取访问文件。 这些文件可能很大(数百GB),所以我写了一个简单的类,让我像string一样对待文件,并隐藏所有的查找和读取。 当时我写封装类,我不知道mmap模块 。 在阅读mmap的文档时,我认为“很好 – 这正是我所需要的,我将取出我的代码,并用mmapreplace它,这可能更有效,删除代码总是好的。 问题是,mmap不适用于大文件! 这对我来说是非常惊人的,因为我认为这也许是最明显的应用。 如果该文件高于几千兆字节,那么我得到一个EnvironmentError: [Errno 12] Cannot allocate memory 。 这只会发生在一个32位的Python版本,所以它似乎没有地址空间,但我找不到任何文档。 我的代码只是 f = open('somelargefile', 'rb') map = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ) 所以我的问题是我在这里错过了一些明显的东西? 有没有办法让mmap在大文件上移植工作,还是应该回到我的天真文件包装? 更新:似乎有一种感觉,Python mmap应该与POSIX mmap具有相同的限制。 为了更好地expression我的挫折感,这里有一个简单的类,它只有mmap的一小部分function。 import os class Mmap(object): def __init__(self, f): """Initialise with a file object.""" self.source = f def __getitem__(self, key): try: # […]
我正在试图使用下面的代码(test.c)“mmap”一个二进制文件(〜8Gb)。 #include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <sys/mman.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #define handle_error(msg) \ do { perror(msg); exit(EXIT_FAILURE); } while (0) int main(int argc, char *argv[]) { const char *memblock; int fd; struct stat sb; fd = open(argv[1], O_RDONLY); fstat(fd, &sb); printf("Size: %lu\n", (uint64_t)sb.st_size); memblock = mmap(NULL, sb.st_size, PROT_WRITE, MAP_PRIVATE, fd, […]
把一个完美的laravel项目从一个git变成了一个运行MAMP的mac。 项目在Linux机器上完美运行。 composer php安装 PHP的工匠迁移,得到以下错误: [PDOException] SQLSTATE[HY000] [2002] No such file or directory 注意:php -v是5.5和mysql -v是从terminal5.5这里是我的config / database.php的一部分 'mysql' => array( 'driver' => 'mysql', 'host' => 'localhost', 'database' => 'essays', 'username' => 'root', 'password' => 'root', 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', 'prefix' => '', ), 我试图用127.0.0.1replace本地主机无济于事。 请帮忙.. 编辑:我在我的php.ini中添加这三行 mysql.default_socket = /var/run/mysqld/mysqld.sock mysqli.default_socket = /var/run/mysqld/mysqld.sock […]
我有一个简单的程序,试图访问用户空间中的内存,第一个结构页面的内存中的物理内存。 在64位机器上,这个地址是: 内核虚拟地址:ffffea0000000000 物理地址:0000620000000000 我正尝试通过用户空间中的mmap来访问这个物理地址。 但是下面的代码崩溃了内核。 int *addr; if ((fd = open("/dev/mem", O_RDWR|O_SYNC)) < 0 ) { printf("Error opening file. \n"); close(fd); return (-1); } /* mmap. address of first struct page for 64 bit architectures * is 0x0000620000000000. */ addr = (int *)mmap(0, num*STRUCT_PAGE_SIZE, PROT_READ, MAP_PRIVATE, fd, 0x0000620000000000); printf("addr: %p \n",addr); printf("addr: %d \n",*addr); […]
我有一个长期生活的应用程序与频繁的内存分配 – 释放。 任何malloc实现返回将内存释放回系统? 在这方面,什么是这样的行为: ptmalloc 1,2(glibc默认)或3 dlmalloc tcmalloc(谷歌线程malloc) solaris 10-11默认的malloc和mtmalloc FreeBSD 8默认的malloc(jemalloc) 囤地malloc? 更新 如果我的应用程序的内存消耗在白天和夜晚可能会非常不同(例如),我可以强制任何malloc将释放的内存返回给系统吗? 没有这样的返回释放内存将被换出,并在很多时候,但这样的内存只包含垃圾。
POSIX环境至less提供两种访问文件的方式。 有标准的系统调用open() , read() , write()和friends,但也有使用mmap()将文件映射到虚拟内存的选项。 什么时候最好使用一个呢? 他们个人的优点是什么,包括两个接口的优点?
我正在开发一个程序,用于处理可能达到100GB或更大容量的文件。 这些文件包含可变长度logging的集合。 我已经完成了第一个实现,现在正在寻求提高性能,特别是在更高效地执行I / O操作之后,因为input文件被多次扫描。 有没有经验法则使用mmap()与通过C ++的fstream库读取块? 我想要做的是从磁盘读取大块到缓冲区,从缓冲区处理完整的logging,然后阅读更多。 mmap()代码可能会变得非常混乱,因为mmap的d块需要位于页面大小的边界(我的理解),logging可能跨越页面边界。 有了fstream ,我只需要开始logging并重新阅读,因为我们不限于阅读位于页面大小边界上的块。 如何在不实际编写完整实现的情况下,在这两个选项之间做出决定? 任何经验法则(例如, mmap()快两倍)或简单的testing?