研:内存映射方式处理大数据(20G) mmap+memcpy

本文探讨了通过mmap和memcpy处理20GB大数据的方法,包括遇到的char转int问题、核心dump错误及bus error。通过与传统fstream读写的对比,研究了mmap的效率优势。尽管过程充满挑战,如内存映射的bug和memcpy的错误,但最终实现了大文件的高效读写操作。

目的,快速读写20G数据,,

方法:mmap+memcpy

状态:暂时放弃治疗

已搞定: 

bug: mmap+memcpy, char 转int 又出问题了

研:mmap + memcpy 与传统 ofream读写对比

研:mmap 总结

乱到我都不想看,,,毕竟草稿本。

 

各位大佬,
我想用mmap+memcpy将A文件(超过6gb,都是字符) 每个字符变成一个int数据 在写进B文件,但老是core 掉,我的做法如下:
1.mmap好A,关闭文件
2.mmap好B,长度4096,
3.循环读A的1024 个字符,转int,放进一个int 数组,
4.mmcpy 这个数组就B
5.改变offset,再映射,继续2-5的循环

请各位大佬指导下呗,跪谢

 

 

 还有个问题啊,就是我A是6gb,那么我B直接指定大小4*6gb是否刚好?

 

 刚开始应该用truncate()把文件B的长度设置为文件A的长度。应该是你没扩大文件B的长度,mmap()的参数offset超过文件B的长度,mmap()失败。

 

### 性能分析与可行性探讨 在 Linux 系统下处理大量数据时,多次使用 `memcpy` 是一种常见做法,但其性能和可行性取决于多个因素。`memcpy` 是一种高效的内存拷贝函数,适用于连续内存块的数据复制操作,但频繁调用 `memcpy` 可能带来一定的性能瓶颈,尤其是在大规模数据传输场景下。 #### 内存拷贝的性能影响 `memcpy` 的性能通常取决于硬件架构和内存访问速度。在现代 CPU 上,`memcpy` 利用了 SIMD(单指令多数据)技术,能够实现高效的内存拷贝[^3]。然而,当数据量非常大时,频繁调用 `memcpy` 会导致 CPU 缓存频繁刷新,从而降低性能。此外,`memcpy` 涉及到用户空间的内存操作,不涉及内核态的上下文切换,因此在性能上优于系统调用。 #### 避免不必要的内存拷贝 在某些场景下,可以通过减少 `memcpy` 的使用来提升性能。例如,使用内存映射(`mmap`)可以直接将文件或共享内存映射到进程地址空间,避免了数据在用户空间和内核空间之间的拷贝。此外,零拷贝技术(Zero-Copy)也可以减少数据在内存中的复制次数,从而提升数据传输效率[^1]。 #### 优化策略 为了优化 `memcpy` 的使用,可以采取以下策略: 1. **批量处理**:将多个小块数据合并成一个大数据块进行拷贝,减少调用 `memcpy` 的次数。 2. **内存池管理**:预先分配一块内存池,避免频繁的内存分配和释放操作。 3. **使用 `memmove` 替代 `memcpy`**:如果数据块可能存在重叠区域,`memmove` 能够保证数据的正确性。 4. **利用 `sendfile` 或 `splice`**:在文件传输场景中,`sendfile` 和 `splice` 可以实现零拷贝传输,减少用户空间与内核空间之间的数据拷贝次数。 #### 示例代码 以下是一个使用 `memcpy` 进行数据拷贝的简单示例: ```cpp #include <iostream> #include <cstring> #include <cstdlib> const size_t DATA_SIZE = 1024 * 1024; // 1MB int main() { char* src = static_cast<char*>(malloc(DATA_SIZE)); char* dst = static_cast<char*>(malloc(DATA_SIZE)); // 初始化数据 memset(src, 'A', DATA_SIZE); // 使用 memcpy 进行数据拷贝 memcpy(dst, src, DATA_SIZE); // 释放内存 free(src); free(dst); return 0; } ``` #### 结论 `memcpy` 在 Linux 系统中是一种高效的内存拷贝方式,但在处理大量数据时,应结合具体场景进行优化。通过减少不必要的内存拷贝、使用内存池管理、以及利用零拷贝技术,可以显著提升数据传输的性能。因此,在实际应用中,应根据数据量和系统资源合理选择拷贝策略,以确保系统的高效运行。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值