我面临一个挑战,需要逐行读写(以G为单位)文件。阅读了许多论坛帖子和网站(包括一堆SO),mmap被建议作为读/写文件的最快选项。然而,当我用readline和mmap技术实现我的代码时,发现mmap比两者中更慢。这对读取和写入都是如此。我一直在测试大约600 MB的文件。
我的实现是逐行解析,然后标记该行。我只会提供文件输入。
这里是getline实现:
void two(char* path) {
std::ios::sync_with_stdio(false);
ifstream pFile(path);
string mystring;
if (pFile.is_open()) {
while (getline(pFile,mystring)) {
// c style tokenizing
}
}
else perror("error opening file");
pFile.close();
}
这里是 mmap:
void four(char* path) {
int fd;
char *map;
char *FILEPATH = path;
unsigned long FILESIZE;
// find file size
FILE* fp = fopen(FILEPATH, "r");
fseek(fp, 0, SEEK_END);
FILESIZE = ftell(fp);
fseek(fp, 0, SEEK_SET);
fclose(fp);
fd = open(FILEPATH, O_RDONLY);
map = (char *) mmap(0, FILESIZE, PROT_READ, MAP_SHARED, fd, 0);
/* Read the file char-by-char from the mmap
*/
char c;
stringstream ss;
for (long i = 0; i <= FILESIZE; ++i) {
c = map[i];
if (c != '\n') {
ss << c;
}
else {
// c style tokenizing
ss.str("");
}
}
if (munmap(map, FILESIZE) == -1) perror("Error un-mmapping the file");
close(fd);
}
出于简洁的目的,我省略了大量错误检查。
我的mmap实现是否不正确,从而影响性能?也许对于我的应用程序来说,mmap并非理想选择?
感谢任何意见或帮助!
open
和mmap
,因此当您可以在open
后直接使用fstat
时,使用fopen
、fseek
和ftell
没有任何意义。 - Zan Lynx