gpt4 book ai didi

c++ - std::ifstream 缓冲区缓存

转载 作者:可可西里 更新时间:2023-11-01 17:39:45 24 4
gpt4 key购买 nike

在我的应用程序中,我试图合并排序的文件(当然要保持它们排序),所以我必须遍历两个文件中的每个元素,以将最小的元素写入第三个文件。这在大文件上工作得非常慢,就我没有看到任何其他选择(必须完成迭代)而言,我正在尝试优化文件加载。我可以使用一些 RAM,用于缓冲。我的意思是每次我可以读取一次 100Mb 之类的东西并在之后使用该缓冲区,而不是每次从两个文件中读取 4 个字节,直到缓冲区中没有元素,然后我将再次重新填充缓冲区。但我想 ifstream 已经在这样做了,它会给我更多的性能吗?有什么理由吗?如果 fstream 可以,也许我可以更改该缓冲区的大小?

已添加

我当前的代码看起来像那样(伪代码)

// this is done in loop
int i1 = input1.read_integer();
int i2 = input2.read_integer();
if (!input1.eof() && !input2.eof())
{
if (i1 < i2)
{
output.write(i1);
input2.seek_back(sizeof(int));
} else
input1.seek_back(sizeof(int));
output.write(i2);
}
} else {
if (input1.eof())
output.write(i2);
else if (input2.eof())
output.write(i1);
}

我不喜欢这里的是

  • seek_back - 我必须返回到之前的位置,因为无法查看 4 个字节
  • 从文件中读取过多
  • 如果其中一个流处于 EOF 中,它仍会继续检查该流,而不是将另一个流的内容直接输出,但这不是一个大问题,因为 block 大小几乎总是相等的。

你能提出改进建议吗?

谢谢。

最佳答案

无需深入讨论流缓冲区,您可以摆脱 seek_back 并通常通过执行以下操作使代码更简单:

using namespace std;
merge(istream_iterator<int>(file1), istream_iterator<int>(),
istream_iterator<int>(file2), istream_iterator<int>(),
ostream_iterator<int>(cout));

编辑:

添加了二进制功能

#include <algorithm>
#include <iterator>
#include <fstream>
#include <iostream>

struct BinInt
{
int value;
operator int() const { return value; }
friend std::istream& operator>>(std::istream& stream, BinInt& data)
{
return stream.read(reinterpret_cast<char*>(&data.value),sizeof(int));
}
};

int main()
{
std::ifstream file1("f1.txt");
std::ifstream file2("f2.txt");

std::merge(std::istream_iterator<BinInt>(file1), std::istream_iterator<BinInt>(),
std::istream_iterator<BinInt>(file2), std::istream_iterator<BinInt>(),
std::ostream_iterator<int>(std::cout));
}

关于c++ - std::ifstream 缓冲区缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4558068/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com