将大的文本文件加载到RAM中以实现更快的C++工作



我想尽快读取大(3.5GB(文件,因此我认为应该先将其加载到RAM中,而不是使用ifstreamgetline()

我的目标是找到具有相同字符串的数据行。示例

textdata abc123 XD0AA
textdata abc123 XD0AB
textdata abc123 XD0AC
textdata abc123 XD0AA

所以我需要读取第一行,然后遍历所有文件,直到找到具有相同XD0AA字符串的第四行(在本例中(。

这就是我目前所做的:

string line;
ifstream f("../BIG_TEXT_FILE.txt");
stringstream buffer;
buffer << f.rdbuf();
string f_data = buffer.str();
for (int i = 0; i < f_data.length(); i++)
{
getline(buffer, line);//is this correct way to get the line (for iteration)?
line = line.substr(0, line.find("abc"));
cout << line << endl;
}
f.close();
return 0;

但它占用的RAM是文件(7GB(的两倍。

这里是固定代码:

string line, token;
int a;
ifstream osm("../BIG_TEXT_FILE.txt");
stringstream buffer;
buffer << f.rdbuf();
//string f_data = buffer.str();
f.close();
while (true)
{
getline(buffer, line);
if (line.length() == 0)
break;
//string delimiter = "15380022";
if (line.find("15380022") != std::string::npos)
cout << line << endl;
}
return 0;

但是我如何使getline((重新读取一遍呢?

我在这些情况下使用过压缩。解压缩速度快于IO速度。文本压缩得很好。

读取gzip文件的示例如下:

如何在C++中逐行读取.gz文件?

我想尽快读取大(3.5GB(文件,因此我认为我应该首先将其加载到RAM中

将整个文件加载到内存中很可能不会带来任何显著的性能优势。

所有现代通用操作系统都有一个磁盘缓存,它可以自动将最近和经常使用的磁盘读取保存在RAM中。

即使您确实将整个文件加载到内存中,在大多数常见的现代操作系统中,这也只是意味着您正在将文件加载到虚拟内存中。它不能保证文件实际上在物理内存中,因为操作系统通常会将未使用的虚拟内存交换到磁盘。因此,通常最好简单地让操作系统处理所有事情。

如果你真的想确保文件实际上在物理内存中(我不建议这样做(,那么你必须使用特定于操作系统的功能,例如Linux上的mlock或Microsoft Windows上的VirtualLock功能,它可以防止操作系统将内存交换到磁盘。然而,根据系统配置,对于具有默认特权的普通用户来说,锁定如此大量的内存可能是不可能的,因为这可能会危及系统稳定性。因此,可能需要特殊的用户特权。

但是如何使getline((重新读取?

问题是在类型为std::stringstream的对象上使用operator <<将消耗输入。在这方面,它与使用std::ifstream从文件中读取没有什么不同。但是,在读取文件时,您可以使用函数std::istream::seekg简单地查找文件的开头。因此,最好的解决方案可能是使用std::ifstream直接从文件中读取。

最新更新