ファイルを (ギグ単位で) 1 行ずつ読み書きするという課題に直面しています。
多くのフォーラム エントリとサイト (多数の 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 は私のアプリケーションには理想的ではありませんか?
コメントやヘルプをありがとう!