如何在读取文件时获得更高的性能
How to get more performance when reading file
我的程序从网站下载文件(通过curl每30分钟)。(这些文件的大小有可能达到150mb)
所以我认为从这些文件中获取数据可能是低效的。(每5秒搜索一行)
这些文件可以有~ 10,000行
要解析这个文件(值之间用","分隔),我使用regex:
regex wzorzec("(.*),(.*),(.*),(.*),(.*),(.*),(.*),(.*)");
有8个值
现在我要把它压入vector:
allys.push_back({ std::stoi(std::string(wynik[1])), nick, tag, stoi(string(wynik[4])), stoi(string(wynik[5])), stoi(string(wynik[6])), stoi(string(wynik[7])), stoi(string(wynik[8])) });
我使用std::async
来做到这一点,但是对于3个文件(~ 7mb),处理器跳到80%,操作大约需要10秒。我从SSD读取,所以这不是缓慢的IO故障。我正在逐行读取fstream
如何增强此操作?也许我必须解析这个值,并把它推到SQL ?
您可能会通过避免regex
而使用std::strtok
之类的东西来获得一些性能提升,或者只是硬编码在数据中搜索逗号。Regex具有比查找逗号更强大的功能。接下来,如果在对任何给定的向量开始push_back
序列之前使用vector::reserve
,则可以在重新分配和移动内存方面节省大量时间。如果你期待一个大的向量,提前为它预留空间。
这可能没有涵盖所有可用的性能想法,但我敢打赌您将看到改进。
这里的问题很可能是正则表达式引入的额外开销,因为您使用了许多可变长度和贪婪匹配(regex引擎将尝试不同的匹配方式以找到最大的匹配结果)。
相反,您可能希望尝试手动解析这些行。有许多不同的方法可以做到这一点。这里有一个简单的示例(它不灵活,并且其中有相当多的重复代码,但有很多优化空间)。但它应该解释基本思想:
#include <iostream>
#include <sstream>
#include <cstdlib>
const char *input = "1,Mario,Stuff,4,5,6,7,8";
struct data {
int id;
std::string nick;
std::string tag;
} myData;
int main(int argc, char **argv){
char buffer[256];
std::istringstream in(input);
// Read an entry and convert/store it:
in.get(buffer, 256, ','); // read
myData.id = atoi(buffer); // convert and store
// Skip the comma
in.seekg(1, std::ios::cur);
// Read the next entry and convert/store it:
in.get(buffer, 256, ','); // read
myData.nick = buffer; // store
// Skip the comma
in.seekg(1, std::ios::cur);
// Read the next entry and convert/store it:
in.get(buffer, 256, ','); // read
myData.tag = buffer; // store
// Skip the comma
in.seekg(1, std::ios::cur);
// Some test output
std::cout << "id: " << myData.id << "nnick: " << myData.nick << "ntag: " << myData.tag << std::endl;
return 0;
}
请注意,如果条目太长或太短(或以其他方式中断),则不会有任何错误处理。
控制台输出:
id: 1
nick: Mario
tag: Stuff
相关文章:
- 理解boost::asio-async_read在无需读取内容时的行为
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 使用新行和不使用新行读取文件
- 读取文件并输入到矢量中
- 与普通变量相比,仅仅读取原子变量的性能有什么不同吗
- 多个 OpenMP 线程读取(而不是写入)共享变量的性能成本?
- 在C 中读取大型CSV文件性能问题
- Linux 与 Windows,C++读取 CSV 文件的运行时性能差异
- C和C++文件读取性能的比较
- 在Windows上读取性能数据计数器是否需要任何特殊的安全权限
- 从文件中读取大量数据并以有效的方式解析日期.如何提高海量数据的性能
- 从标准输出读取奇怪的性能问题
- 是否有可能通过使用openMP在fstream(文件读取)上获得一些性能提升
- 堆与读取Map最左边节点的相对性能
- 读取二进制文件的性能
- 如何在读取文件时获得更高的性能
- 逐行读取文件与读取整个文件时的性能
- c++文本文件读取性能
- 如何在C++中读取性能计数器
- C++ 从磁盘写入和读取性能