Chinaunix

标题: 急救:memcpy特别慢,把访问文件的所有进程停了就快了,如何解决? [打印本页]

作者: zergzb    时间: 2011-07-02 11:56
标题: 急救:memcpy特别慢,把访问文件的所有进程停了就快了,如何解决?
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特别慢,把访问文件的所有进程停了就快了,如何解决?
作者: cobras    时间: 2011-07-02 15:16
看不出有什么必要使用共享内存。如果只是文件拷贝,块拷贝就很快了。
作者: zergzb    时间: 2011-07-02 16:36
回复 2# cobras


    其他进程要访问啊。内容更新实时要求也很高。
作者: k8king    时间: 2011-07-03 11:18
你确保其他程序不是用fread进行文件访问的?这个应该大家统一才有效啊,应该是其他程序访问你开辟的内存才对的,有可能其他访问文件的进程加锁了,导致看起来是memcpy比较慢,或者你内存不够大,需要不停的与磁盘做交互。
不妨试试换种架构,No-SQL可能会适合你。
作者: drangon    时间: 2011-07-03 11:41
问题不在于memcpy,而是在于mmap,

mmap再memcpy,跟先fread,再memcpy效果是很相似的,慢都是慢在从磁盘读数据到内存,所以停止了其他读写磁盘的进程,这边就快了。
作者: zergzb    时间: 2011-07-04 20:21
回复 4# k8king


    所有程序使用的接口是封装好了的,统一性没问题
作者: zergzb    时间: 2011-07-04 20:22
回复 5# drangon


    请详细解释下,我跟进去是memcpy语句执行很慢。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2