我正在尝试处理大文件,现在我有了这个文件 加载到内存和以下解析函数:
在第一种情况下,我正在从文件的一部分构建字符串(读取csv的头文件),第一个函数:
void csv_parse_items_file(const char* file, size_t fsize,
//void(*deal)(const string&, const size_t&, const int&),
size_t arrstart_counter = 0) {
size_t idx = 0;
int line = 0;
size_t last_idx = 0;
int counter = 0;
cout<<"items_header before loop, thread_id="+std::to_string(thread_index())<<endl;
map<string, int> headers;
{
int counter = 0;
while (file[idx] && file[idx] != '\n') {
if (file[idx] == '\t' || file[idx] == '\n') {
string key(file, last_idx, idx - last_idx);
headers[key] = counter++;
last_idx = idx + 1;
}
++idx;
}
}
cout<<"items_header after loop, thread_id="+std::to_string(thread_index())<<endl;
... then the processing continues in a loop
与文件大小(86431022和237179072)相比,头文件少于1000个字符。
但仍然排除这一行string key(file, last_idx, idx - last_idx);
需要很长时间;
$g++ -v
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 8.0.0 (clang-800.0.42.1)
Target: x86_64-apple-darwin16.1.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/binrocessing_items:1306054
使用g++ -pthread -c -g -std=c++11
使用mmap(NULL, size_, PROT_READ, MAP_PRIVATE, fd_, 0);
答案 0 :(得分:1)
maxLine
相当于string key(file, last_idx, idx - last_idx);
。您每次都在循环中复制整个文件,然后只提取一小部分文件。
将其设为string key(std::string(file), last_idx, idx - last_idx);