使用boost无序哈希映射的多线程

时间:2014-03-16 10:01:42

标签: multithreading boost mutex

我有一个程序,它逐行读取文件,对行进行散列并将其存储在boost无序哈希映射中(如下所示)。但是,我已经意识到这段代码是我程序中的一个瓶颈,因为该文件可能非常糟糕。

    typedef boost::unordered_map<std::string,std::string> MAP;
    MAP hash_table;

    FILE *stream = fopen(filename, "r");
    char *line;

    while(fscanf(stream, " %m[^\n]", &line) == 1)
    {

            hash_table[line].push_back(line);
    } 

我打算创建多个线程,每个线程负责读取和散列文件的一部分。我已经读过,提升无序映射是线程不安全的。如何在下面的代码中加入互斥锁。我是否能够仅锁定当前正在修改的存储桶而不是整个哈希映射?

1 个答案:

答案 0 :(得分:0)

您提到这是您的性能瓶颈。鉴于此,我将为您提供一些与互斥体无关的性能提示,因为我认为线程只会让事情变得更糟。

鉴于您的密钥和值完全相同(line),请使用unordered_set并节省大约一半的存储空间。

您正在使用特殊的scanf格式%m。这会动态分配您必须释放的内存。但是你没有自由,所以你在泄漏。而且,在scanf期间分配然后复制到再次分配的std :: string是一个很大的浪费时间。最好是存储直接分配的fscanf(并且在完成哈希表时自由)。

您正在对整个字符串进行哈希处理。如果您对将要阅读的线条有所了解,可以加快速度。例如,只对每行的前十个字符进行哈希处理。

一旦清除了其中一些内容,您的瓶颈可能就是文件系统。