我正在使用 mmap() 快速读取大文件,将我的脚本基于这个问题的答案(C++ 快速读取文本文件 https://stackoverflow.com/questions/17925051/fast-textfile-reading-in-c).
我正在使用 sehe 答案的第二个版本:
#include <algorithm>
#include <iostream>
#include <cstring>
// for mmap:
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
const char* map_file(const char* fname, size_t& length);
int main()
{
size_t length;
auto f = map_file("test.cpp", length);
auto l = f + length;
uintmax_t m_numLines = 0;
while (f && f!=l)
if ((f = static_cast<const char*>(memchr(f, n, l-f))))
m_numLines++, f++;
std::cout << "m_numLines = " << m_numLines << "n";
}
void handle_error(const char* msg) {
perror(msg);
exit(255);
}
const char* map_file(const char* fname, size_t& length)
{
int fd = open(fname, O_RDONLY);
if (fd == -1)
handle_error("open");
// obtain file size
struct stat sb;
if (fstat(fd, &sb) == -1)
handle_error("fstat");
length = sb.st_size;
const char* addr = static_cast<const char*>(mmap(NULL, length, PROT_READ, MAP_PRIVATE, fd, 0u));
if (addr == MAP_FAILED)
handle_error("mmap");
// TODO close fd at some point in time, call munmap(...)
return addr;
}
而且效果非常好。
但是,如果我通过多个文件的循环来实现它(我只需将 main() 函数名称更改为:
void readFile(std::string &nomeFile) {
然后在 main() 函数中获取“f”对象中的文件内容:
size_t length;
auto f = map_file(nomeFile.c_str(), length);
auto l = f + length;
并从调用它main()
在文件名列表上循环),过了一会儿我得到:
open: Too many open files
我想有一种方法可以在处理文件后关闭 open() 调用,但我不知道如何以及在哪里准确放置它。我试过:
int fc = close(fd);
在 readFile() 函数的末尾,但它没有改变任何东西。
预先非常感谢您的帮助!
EDIT:
在收到重要建议后,我对 mmap() 和 std::cin() 的不同方法进行了一些性能比较,请查看:C++ 中的快速文件读取,mmap() 和 std::cin() 不同策略的比较结果解释 https://stackoverflow.com/questions/55379852/fast-file-reading-in-c-comparison-of-different-strategies-with-mmap-and-std为了结果