gpt4 book ai didi

c++ - 如何最快读取带标记的64位int文件?

转载 作者:太空狗 更新时间:2023-10-29 21:43:13 24 4
gpt4 key购买 nike

我正在尝试从文件中读取一些数据以填充以下数据结构:

typedef uint64_t t_feat; 

typedef pair<vector<t_feat>, int> t_featfam;

每个日志文件都包含几个这样的家族,所以我想将它们全部保存在一个 vector 中。格式非常简单的日志文件:

line = "-": start a new family

line = "#": family ends here

line = 64bit unsigned integer (as string): add this value to the family

line = "!": mark the following integer as important (exactly one is marked like this in each family), the marking is done by setting the the second value of the family to the index of the important element

文件中没有错误,所以每个 ! 后跟一个整数,所有系列都正确开始和结束,没有额外的空格或任何东西(唯一的异常(exception)是可能的空行文件末尾)。

现在我正在使用以下代码:

void read_data_from_file(const string &fname, vector<t_featfam> &data)
{
ifstream f;
f.open(fname, ios::in);
while (!f.eof())
{
string currentline;
getline(f, currentline);
if (currentline == "" || currentline == "#")
continue;
else if (currentline == "-")
data.push_back(t_featfam());
else if (currentline == "!")
data.back().second = data.back().first.size();
else
{
istringstream iss(currentline);
t_feat value;
iss >> value;
data.back().first.push_back(value);
}
}
}

这行得通,但感觉效率极低,可能是……如果它只是数字,我当然会只使用 fstreams,但事实上,我不确定如何正确地做到这一点。谁能暗示我正确的方向?这应该是可能的。我正在使用 Visual Studio,不介意特定于 VS 的解决方案,但不想包含提升。

编辑2:现在是一个真正有效的版本,使用 steves 代码,并通过 luk32 的想法进行了改进......比上面的代码快 4 倍...

void read_data_from_file(const string &fname, vector<t_featfam> &data)
{
ifstream f;
f.open(fname, ios::in);
char* currentline = new char [30];
while (!f.eof())
{
f.getline(currentline, 30);
switch (currentline[0])
{
case '\0':
case '#':
break;
case '-':
data.push_back(t_featfam());
break;
case '!':
data.back().second = data.back().first.size();
break;
default:
data.back().first.push_back(stoull(currentline));
break;
}
}
delete currentline;
}

最佳答案

我可能会按照以下方式做一些事情:

  • currentline 移到循环之外 - 防止每次循环都重新分配
  • currentline 的第一个 char 上使用 switch 语句,所以我们跳转而不是多个 if/else 语句
  • 使用 std::stoull 而不是 stringstreamcurrentline 转换为 uint64_t

这是函数(没有测试看是否编译,只是写出来的)

void read_data_from_file(const string &fname, vector<t_featfam> &data)
{
ifstream f;
f.open(fname, ios::in);
string currentline;
while (!f.eof())
{
getline(f, currentline);
switch (currentline.c_str()[0])
{
case '\0':
case '#':
break;
case '-':
data.push_back(t_featfam());
break;
case '!':
data.back().second = data.back().first.size();
break;
default:
data.back().first.push_back(std::stoull(currentline));
break;
}
}
}

关于c++ - 如何最快读取带标记的64位int文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23483973/

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