免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4963 | 回复: 6
打印 上一主题 下一主题

急救:memcpy特别慢,把访问文件的所有进程停了就快了,如何解决? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-07-02 11:56 |只看该作者 |倒序浏览
struct stat file_stat;
        char    FILENAME[300], FILENAME2[300];
        char    command[300];

        strcpy( FILENAME,  argv[1] );
        strcpy( FILENAME2,  argv[2] );
        if (stat(FILENAME, &file_stat) < 0)
        {
                printf("%s status error!\n", FILENAME);
                perror("stat");
                exit(1);
        }

        int length = file_stat.st_size;
              int fd = shm_open(FILENAME,O_RDWR , S_IRWXO | S_IRWXG | S_IRWXU);
        if (fd < 0)
        {
                perror("shm_open");
                exit(2);
        }

        int n = ftruncate(fd, length);
        if (n < 0)
        {
                perror("ftruncate");
                exit(2);
        }
        void * p1;

        p1 = (void *)mmap(0, length, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);

        if (p1 < 0)
        {
                perror("mmap");
                exit(2);
        }

        int fd2 = shm_open(FILENAME2,O_RDWR | O_CREAT , S_IRWXO | S_IRWXG | S_IRWXU);
        if (fd2 < 0)
        {
                perror("shm_open");
                exit(2);
        }

        int n2 = ftruncate(fd2, length);
        if (n2 < 0)
        {
                perror("ftruncate");
                exit(2);
        }
        void * p2;

        p2 = (void *)mmap(0, length, PROT_READ|PROT_WRITE, MAP_SHARED, fd2, 0);

        if (p2 < 0)
        {
                perror("mmap");
                exit(2);
        }


       memcpy(p2, p1, length);

        munmap(p1, length);
        munmap(p2, length);

         close(fd);
        close(fd2);
        exit(0);



急救:memcpy特别慢,把访问文件的所有进程停了就快了,如何解决?

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
2 [报告]
发表于 2011-07-02 15:16 |只看该作者
看不出有什么必要使用共享内存。如果只是文件拷贝,块拷贝就很快了。

论坛徽章:
0
3 [报告]
发表于 2011-07-02 16:36 |只看该作者
回复 2# cobras


    其他进程要访问啊。内容更新实时要求也很高。

论坛徽章:
0
4 [报告]
发表于 2011-07-03 11:18 |只看该作者
你确保其他程序不是用fread进行文件访问的?这个应该大家统一才有效啊,应该是其他程序访问你开辟的内存才对的,有可能其他访问文件的进程加锁了,导致看起来是memcpy比较慢,或者你内存不够大,需要不停的与磁盘做交互。
不妨试试换种架构,No-SQL可能会适合你。

论坛徽章:
0
5 [报告]
发表于 2011-07-03 11:41 |只看该作者
问题不在于memcpy,而是在于mmap,

mmap再memcpy,跟先fread,再memcpy效果是很相似的,慢都是慢在从磁盘读数据到内存,所以停止了其他读写磁盘的进程,这边就快了。

论坛徽章:
0
6 [报告]
发表于 2011-07-04 20:21 |只看该作者
回复 4# k8king


    所有程序使用的接口是封装好了的,统一性没问题

论坛徽章:
0
7 [报告]
发表于 2011-07-04 20:22 |只看该作者
回复 5# drangon


    请详细解释下,我跟进去是memcpy语句执行很慢。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP