当两个线程读取文件并标记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 错误:捕获缓冲区溢出 - 可能是格式错误的输入文件。]

从CSV文件中读取jpg图片的URL地址并多线程批量下载

Keras Tokenizer 仅对 CSV 文件的第一行进行标记

如何读取 2 列 csv 文件并创建字典?

当我们从 s3 中的 csv 文件读取数据并在 aws athena 中创建表时如何跳过标题。

快速读取所有 csv 文件并更新共享字典