当两个线程读取文件并标记CSV文件时,c ++ Boost多线程运行缓慢
Posted
技术标签:
【中文标题】当两个线程读取文件并标记CSV文件时,c ++ Boost多线程运行缓慢【英文标题】:c++ Boost Multithread Running Slow when two threads read file and tokenize the CSV File 【发布时间】:2011-05-11 15:11:08 【问题描述】:我有两个功能,它曾经对我有用,我对代码做了一些更改,但我不知道发生了什么。当我将这些函数作为多线程执行时,CPU 为 10-30%,而且速度非常慢。它只是逐行读取文件,然后使用 boost token 解析 CSV 行。
boost::thread OffLineUL(&AvaTTi::AvaCollectTTiAdvance::UeAndCellParamParseUL,c,tracefilenameUL.c_str(),NumOfLines,GHOSTFILTER,"","/",OffLineMode,OPENEXCELAUTO);
boost::thread OffLineDL(&AvaTTi::AvaCollectTTiAdvance::UeAndCellParamParseDL,c,tracefilenameDL.c_str(), NumOfLines,"","/",OffLineMode,OPENEXCELAUTO);
OffLineDL.join();
OffLineUL.join();
int AvaCollectTTiAdvance::UeAndCellParamParseDL(const char *inname, int NumOfRecords, const char *UserDir, const char* CurrentDir, int OffLineMode, int OPENEXCELAUTO)
typedef boost::tokenizer <boost::escaped_list_separator<char> > my_tokenizer;
vector <string> mystr;
std::ifstream infile(TTiAsciiTraceOutputUserDir.str(),std::ios::in);
while (getline(infile, line) && lineCount <= NumOfRecords)
for (my_tokenizer::iterator it(tok.begin()), end(tok.end()); it != end; ++it)
mystr.push_back(*it);
....................
....................
有人可以帮忙吗?我的想法不多了。谢谢。
【问题讨论】:
那是共享向量吗:mystr? 你正在解析同一个文件:tracefilenameUL ??? 如果我在 while 循环之前使用 mutex.lock 并在文件完成后使用 mutex.unlock(),那么它会变得更快但不是真正的多线程。 我正在使用 VS 2010,我需要对项目设置做任何事情吗?我想我做了一些更改,但不确定是否会导致问题 是在您将代码更改为使用多线程之后发生了减速,还是曾经使用多线程运行得足够快,但您更改了代码中的其他内容并使其变慢? 【参考方案1】:如果您在线程之间共享资源,例如向量 mystr,那么您需要使用线程同步机制来访问这些资源,否则您的向量将被损坏。
对于将同时从多个线程访问的任何变量都是如此,如果它们被至少一个线程写入的话。
我不能说问题是什么,因为您没有提供足够的数据,我无法从您的代码中确定哪些变量是本地的,哪些不是,哪些变量仅由一个或多个线程使用。
【讨论】:
vector mystr,它不是共享资源。我只是在其他函数中使用了相同的向量名称。会不会造成问题? 它在哪里声明,这个向量,我在你的函数范围内看不到它?以上是关于当两个线程读取文件并标记CSV文件时,c ++ Boost多线程运行缓慢的主要内容,如果未能解决你的问题,请参考以下文章
在 pandas 中读取 csv 文件时出错 [CParserError: 标记数据时出错。 C 错误:捕获缓冲区溢出 - 可能是格式错误的输入文件。]
Keras Tokenizer 仅对 CSV 文件的第一行进行标记