【发布时间】:2014-08-09 17:19:23
【问题描述】:
我的程序从站点下载文件(每 30 分钟通过 curl)。 (这些文件的大小可能达到 150 mb)
所以我认为从这些文件中获取数据可能效率低下。 (每 5 秒搜索一行)
这些文件可以有 ~10.000 行
要解析这个文件(值由“,”分隔),我使用正则表达式:
regex wzorzec("(.*),(.*),(.*),(.*),(.*),(.*),(.*),(.*)");
有 8 个值。
现在我必须把它推到向量:
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 个文件 (~7 mb),处理器会跳转到 80%,并且操作大约需要 10 秒。我从 SSD 读取,所以这不是缓慢的 IO 故障。
我正在通过fstream每行读取数据线
如何提升这个操作? 也许我必须解析这些值,并将其推送到 SQL 中?
最好的问候
【问题讨论】:
-
请参阅How to split a string in C++? 以获取解析行的正则表达式的替代方案
-
正则表达式会导致你的处理器跳到 80% 不要为此使用正则表达式。
-
你的正则表达式错了吗? '.*' 应该在大多数正则表达式解析引擎中贪婪地匹配,并且后面会包含逗号。
-
@C.R.那个正则表达式看起来不错,但是所有那些贪婪的量词都会使它变得非常低效。
标签: c++ regex multithreading