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