Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 具有boost无序散列映射的多线程_Multithreading_Boost_Mutex - Fatal编程技术网

Multithreading 具有boost无序散列映射的多线程

Multithreading 具有boost无序散列映射的多线程,multithreading,boost,mutex,Multithreading,Boost,Mutex,我有一个程序,它逐行读取一个文件,对该行进行散列,并将其存储在boost无序散列映射中(如下所示)。然而,我已经意识到这段代码是我程序中的一个瓶颈,因为文件可能会变得非常糟糕 typedef boost::unordered_map<std::string,std::string> MAP; MAP hash_table; FILE *stream = fopen(filename, "r"); char *line; while(fsca

我有一个程序,它逐行读取一个文件,对该行进行散列,并将其存储在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);
    } 
typedef boost::无序映射;
映射哈希表;
文件*stream=fopen(文件名,“r”);
字符*行;
while(fscanf(流,“%m[^\n]”,&line)==1)
{
哈希表[行]。推回(行);
} 

我计划创建多个线程,每个线程负责读取和散列文件的一块。我已经读到,boost无序映射是线程不安全的。如何将互斥体合并到下面的代码中。我是否只能锁定当前正在修改的bucket而不是整个hash映射?

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

如果您的键和值完全相同(
line
),请使用
unordered\u set
,并节省大约一半的存储空间

您正在使用特殊的scanf格式
%m
。这将动态分配您必须释放的内存。但是你没有释放,所以你在泄漏。此外,在scanf过程中进行分配,然后复制到std::string,这样会浪费大量的时间,而std::string会再次进行分配。最好是直接存储fscanf分配的内容(使用哈希表时是免费的)

您正在散列整个字符串。如果你对你将要阅读的台词有所了解,你可以加快阅读速度。例如,仅散列每行的前十个字符


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

谢谢您的提示。。我尝试将哈希表定义更改为boost::unordered_map,并计算了所用的时间。我没有注意到所用的总时间有任何变化。我需要为fopen方法指定缓冲区大小吗?不,不需要指定缓冲区大小。要知道我们是否可以加快速度,我们需要知道消耗了多少CPU时间和实际(墙)时间。如果您在*nix上,请运行
time myprog
(myprog当然是您的可执行文件,加上它需要的任何参数)。告诉我们这是怎么说的。