目的,快速读写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()失败。
不要想当然,以为失败返回NULL。
On success, mmap() returns a pointer to the mapped area. On error, the value MAP_FAILED (that is, (void *) -1) is returned, and errno is set to indicate the cause of the error.
如果char 到char很简单,char (A)搞到int(B)的,我通过char每次增加1024字节,来映射B大小,但是达不到效果,我不知道哪里错了
我都asert了的
我每次映射长度都最大是4096
mmap()的参数offset超过文件长度,会导致mmap()失败。
5.改变offset,再映射,继续2-5的循环 //是不是没有预先增加文件B的长度,导致mmap()失败?
实际上现在已经不core 了,只是本来感觉应该是6gb A 文件操作后B应该会变成至少6*4=24GB,可我得到的结果B居然是A的一半@沙漠之狐
mmap()的好处:进程把文件映射到进程的虚拟地址空间,可以像访问内存一样访问文件,不需要调用系统调用read()和write()访问文件,从而避免用户模式和内核模式之间的切换,提高读写文件的速度。
1.mmap好A,关闭文件 2.mmap好B,长度4096, 5.改变offset,再映射 把这部分代码发出来看看
醉了,我想着最后一起一把unmap
哦,先unmap掉前面的
页表都被冲爆了
一直mmap
请教一下这是什么原因?
程序怎么能这么写
大佬,我用大文件测试,只能到66501页
遇到的问题:
bug:memcpy core dump bus error
每天进步一点点-->函数fseek() 用法
阅读数 7万+
c++对txt文件的读取与写入 16w+
https://blog.csdn.net/lvbian/article/details/16341973 在linux中使用内存映射(mmap)操作文件 1w+
https://blog.csdn.net/nocodelife/article/details/8647499 mmap实现大文件复制 2k
mmap实现大文件快速拷贝
缺页异常详解 - cosmoslhf的专栏
C函数之memcpy()函数用法
阅读数 25万+
memcpy引发的C常见指针问题
阅读数 1441
memcpy的用法总结
阅读数 10万+