Ele*_*ito 14 linux memory memory-management mmap
我正在编写一个程序,它从网络接收大量数据(不同大小的数据),处理它们并将它们写入内存.由于某些数据可能非常大,我目前的方法是限制使用的缓冲区大小.如果一个片段大于最大缓冲区大小,我将数据写入临时文件,然后以块的形式读取文件以进行处理和永久存储.
我想知道这是否可以改善.我一直在阅读关于mmap的一段时间,但我不是百分百肯定它是否可以帮助我.我的想法是使用mmap来读取临时文件.这有什么用?我担心的主要问题是,偶尔的大块数据不应该填满我的主内存,导致其他所有内容都被换掉.
另外,您认为临时文件的方法是否有用?我是否应该这样做,或者,或许,我应该相信Linux内存管理器为我做这项工作?或者我应该完全做其他事情?
小智 12
Mmap可以在某些方面为您提供帮助,我将用一些假设的例子来解释:
第一件事:假设你的内存不足,你的应用程序拥有100MB的malloc内存,其中50%的内存被换掉,这意味着操作系统必须向交换文件写入50MB,如果你需要读回来,你已经编写,占用然后再读回50MB你的交换文件.
如果内存只是mmap,操作系统不会将这条信息写入交换文件(因为它知道该数据与文件本身相同),而是只会划掉50MB的信息(同样:假设你现在还没有写任何东西)那就是那个.如果您需要再次读取该内存,操作系统将不是从交换文件中获取内容,而是从您已经编写过的原始文件中获取内容,因此如果任何其他程序需要50MB的交换,则它们可用.根本没有交换文件操作的开销.
假设您读取了100MB的数据块,根据最初的1MB标头数据,您想要的信息位于偏移量为75MB,因此您不需要1~74.9MB之间的任何数据!您已经阅读了它,只是为了使您的代码更简单.使用mmap,您将只读取实际访问的数据(四舍五入或OS页面大小,大多为4kb),因此它只读取第一个和第75个MB.我认为制作一种比mmaping文件更简单,更有效的方法来避免磁盘读取非常困难.如果由于某种原因你需要偏移37MB的数据,你可以使用它!您不必再次对其进行mmap,因为整个文件可以在内存中访问(当然受到进程内存空间的限制).
mmap的所有文件都由它们自己备份,而不是由交换文件备份,交换文件用于授予没有要备份的文件的数据,这通常是数据malloced或由文件备份的数据,但是在程序通过msync调用实际告诉操作系统这样做之前,它已被更改并且[不能/不会]写回它.
请注意,您不需要将整个文件映射到内存中,您可以从任何位置(第6个arg - "off_t offset")开始映射任何数量(第二个arg是"size_t length"),但除非您的文件很可能即使系统只包含64mb的物理内存,但你可以安全地映射1GB的数据,但这是为了阅读,如果你打算写,那么你应该更加保守,只映射你需要的东西.
映射文件将帮助您简化代码(您已经拥有内存中的文件内容,可以使用,内存开销少得多,因为它不是匿名内存)而且速度更快(您只会读取程序访问的数据).
归档时间: |
|
查看次数: |
14274 次 |
最近记录: |