Я сталкиваюсь с проблемой чтения / записи файлов (в гигабайтах) построчно.
При чтении многих форумов и сайтов (включая множество SO), mmap был предложен как самый быстрый вариант для чтения / записи файлов. Однако, когда я реализую свой код с помощью методов readline и mmap, mmap медленнее из двух. Это верно как для чтения, так и для письма. Я тестировал файлы размером ~ 600 МБ.
Мои реализации анализируют строку за строкой, а затем токенизируют строку. Я представлю только ввод файла.
Вот реализация 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 не идеален для моего приложения?
Спасибо за любые комментарии или помощь!