linux – mmap和内存使用

前端之家收集整理的这篇文章主要介绍了linux – mmap和内存使用前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在编写一个从网络接收大量数据(不同大小的数据)的程序,处理它们并将其写入内存.由于一些数据可能非常大,我目前的方法是限制使用的缓冲区大小.如果一块大于最大缓冲区大小,我将数据写入一个临时文件,然后以块的形式读取文件进行处理和永久存储.

我想知道这是否可以改善.我一直在阅读有关mmap的一段时间,但如果可以帮助我,我不会百分之百.我的想法是使用mmap读取临时文件.这有帮助吗?我关心的主要事情是,偶尔的大量数据不应该填满我的主要记忆,导致其他一切都被换出.

另外,你认为临时文件方法是有用的吗?我是否应该这么做,或者也许应该相信linux内存管理员为我做这个工作?还是应该做别的事情呢?

解决方法

Mmap可以在某些方面帮助你,我会用一些假设的例子来解释:

第一件事:假设你的内存不足,你的应用程序有一个100MB的内存不足,它的50%被交换出来,这意味着操作系统必须写入50MB的交换文件,如果你需要读回来,你已经写过,占用了,然后再读回来50MB的swapfile.

如果内存只是mmap’ed,操作系统将不会将该条信息写入交换文件(因为它知道该数据与文件本身相同),而是只会擦除50MB的信息(再次:假设你现在还没有写任何东西),那就是这样.如果您需要再次读取该内存,操作系统将从交换文件获取内容,但是从您原来的文件删除,因此如果任何其他程序需要50MB的交换,则可以使用它们.还有没有开销,交换文件操作完全.

假设您读取了100MB的数据量,根据最初的1MB标题数据,您想要的信息位于75MB的位置,因此您不需要1〜74.9MB之间的任何信息!你已经读了它,只是为了使你的代码更简单.使用mmap,您只会读取您实际访问的数据(四舍五入,或OS页面大小,大部分为4kb),因此只能读取第一个和第75个MB.我想,为了避免磁盘读取比mmaping文件更简单,更有效的方法是非常困难的.
如果由于某些原因您需要的数据在偏移37MB,您可以使用它!您不必再次修改它,因为整个文件可以在内存中访问(当然由您的进程的内存空间限制).

所有文件mmap’ed都由自己备份,而不是交换文件,交换文件用于授予没有要备份的文件的数据,通常是数据malloc’ed或由文件备份的数据,但是在程序实际上通过msync调用通知操作系统之前,它已经被修改了[不能/不能]被写回来.

请注意,您不需要将整个文件映射到内存中,您可以从任何位置(第6个参数 – “off_t offset”)开始映射任何数量(第二个arg为“size_t length”),但除非您的文件很可能无论如何,您绝对不用担心地映射1GB的数据,即使系统只包含64MB的物理内存,但是如果您打算写作,那么您应该更加保守,并且只绘制所需的内容.

映射文件将帮助您使代码更简单(您已经拥有内存中的文件内容,可以使用,内存开销更少,因为它不是匿名内存)和更快(您将只读取程序访问的数据).

猜你在找的Linux相关文章