我面临着逐行读取/写入文件(在Gigs中)的挑战.
读取许多论坛条目和网站(包括一堆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();
}
Run Code Online (Sandbox Code Playgroud)
这是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, …Run Code Online (Sandbox Code Playgroud) 我正在重写我的一个Android应用程序以利用NDK,每次打开一个1.5MB文本文件(大约150k行)时,首先要做的事情之一就是将每一行放在一个数据中结构体.当我使用Java的BufferedReader.readLine()执行此操作时,从SD卡读取文件大约需要2.5秒.这是我用于此的代码:
try {
BufferedReader br = new BufferedReader(new FileReader("/sdcard/testfile.txt"));
String thisLine;
while ((thisLine = br.readLine()) != null) {
Log.d(TAG, thisLine);
}
} catch (IOException e) {
//Log error
}
Run Code Online (Sandbox Code Playgroud)
在ifstream中使用C++需要更长的时间......对于同一个文件大约需要3分钟.这是我在C++中使用的代码:
char buffer[256];
ifstream ifs;
ifs.open("/sdcard/testfile.txt", ifstream::in);
if (ifs.is_open()) {
while (!ifs.eof()) {
ifs.getline (buffer,100);
LOGD(buffer);
}
}
Run Code Online (Sandbox Code Playgroud)
我对C++很生疏,但是对于增加的读取时间没有任何合理的解释.有一段时间我认为它可能是LOGD功能,但我尝试完全取消它,读取时间根本没有多大帮助.有没有人对这个问题有什么想法?有没有更快的方法在C++中逐行读取文件?谢谢.