Intel TBB의 Concurrent Hashmap을 사용해보기

7949 단어 TBBCSVHashMap인텔
Intel TBB는 병렬 처리를 구현하는 라이브러리입니다 (Intel에서 제공)



Concurrent HashMap은 Intel TBB 컨테이너 중 하나입니다. (그 외에, 벡터와 큐도 있다)

↓ 이렇게 해서 사용한다. .

     7#include "tbb/concurrent_hash_map.h"
     8#include "tbb/blocked_range.h"
     9#include "tbb/parallel_for.h"
    10#include "tbb/tick_count.h"
    11#include "tbb/task_scheduler_init.h"
    12#include "tbb/concurrent_vector.h"
    13
    14using namespace std;
    15using namespace tbb;
    16
    17typedef tbb::concurrent_hash_map iTbb_addr_pair;
    18static iTbb_addr_pair Tbb_Addr_Pair;

인서션

    69          iTbb_addr_pair::accessor t;
    70          Tbb_Addr_Pair.insert(t, src_ipAddr);
    71          t->second = dest_ipAddr;

저장된 요소 표시

    80    counter = 0;
    81    for(auto itr = Tbb_Addr_Pair.begin(); itr != Tbb_Addr_Pair.end(); ++itr) {
    82      if(counter > 0)
    83        std::cout << counter << ":" << itr->first << "," << itr->second << std::endl;
    84      counter++;
    85    }

익숙해지면 이용은 간단합니다.

예를 들면, ↓와 같은 데이터로부터 IP 어드레스의 쌍(71.153.59.69/149.38.245.191 - IP 어드레스는 랜덤하게 생성)을 저장하고 싶다고 한다. . .

"2019/07/02 00:00:48.033","2019/07/02 00:00:48","2019-07-02T00:00:48Z","841","149.38.245.191","25846","pU","71.153.59.69","51321","Yx","mU6","7gGd0vvjl","5pw","6KLBv","qQOS2G3d","8","nQTqV
mphosHwgZlYtVANbxyXO8","912","198","336","769","278","554","rand-pa1"
"2019/07/02 02:02:54.230","2019/07/02 02:02:54","2019-07-02T02:02:54Z","478","70.146.59.78","41214","Pq","77.21.128.75","23907","Xd","3bt","N1ADubtI0","iJq","XvZpV","TqaGYZOW","5","TCkH2EM
jrPpuVtUhZB3bEpuMpw","953","917","636","718","142","607","rand-pa1"

CSV 파일을 읽고 4열과 7열 항목을 map(srcIP, destIP)에 저장하기로 한다. .

코드를 살펴보십시오. .

     1#include 
     2#include 
     3#include 
     4#include 
     5#include 
     6
     7#include "tbb/concurrent_hash_map.h"
     8#include "tbb/blocked_range.h"
     9#include "tbb/parallel_for.h"
    10#include "tbb/tick_count.h"
    11#include "tbb/task_scheduler_init.h"
    12#include "tbb/concurrent_vector.h"
    13
    14using namespace std;
    15using namespace tbb;
    16
    17typedef tbb::concurrent_hash_map iTbb_addr_pair;
    18static iTbb_addr_pair Tbb_Addr_Pair;
    19
    20std::vector < std::vector< std::string > > parse_csv(const char* filepath)
    21{
    22    std::vector< std::vector< std::string > > cells;
    23    std::string line;
    24    std::ifstream ifs(filepath);
    25
    26    while (std::getline(ifs, line)) {
    27
    28        std::vector< std::string > data;
    29                                                                                                                                                            
    31        boost::tokenizer< boost::escaped_list_separator< char > > tokens(line);
    32        for (const std::string& token : tokens) {
    33            data.push_back(token);
    34        }
    35                                                                                                                                              
    37        cells.push_back(data);
    38    }
    39
    40    return cells;
    41}
    42
    43int main(int argc, char *argv[])
    44{
    45    int counter = 0;
    46
    47    std::string src_ipAddr;
    48    std::string dest_ipAddr;
    49
    50    const auto cells = parse_csv(argv[1]);
    51    for (const auto& rows : cells) {
    52
    53        counter = 0;
    54        for (const auto& cell : rows) {
    55          // std::cout << " " << std::endl;                                                                                                                           
    56
    57          if(counter == 4)
    58            {
    59              // std::cout << cell << std::endl;                                                                                                                                      
    60             src_ipAddr = string(cell);
    61            }
    62
    63          if(counter == 7)
    64            {
    65              // std::cout << cell << std::endl;                                                                                                                                      
    66             dest_ipAddr = string(cell);
    67            }
    68
    69          iTbb_addr_pair::accessor t;
    70          Tbb_Addr_Pair.insert(t, src_ipAddr);
    71          t->second = dest_ipAddr;
    72
    73          counter++;
    74
    75        }
    76                                                                                                                                               
    78    }
    79
    80    counter = 0;
    81    for(auto itr = Tbb_Addr_Pair.begin(); itr != Tbb_Addr_Pair.end(); ++itr) {
    82      if(counter > 0)
    83        std::cout << counter << ":" << itr->first << "," << itr->second << std::endl;
    84      counter++;
    85    }
    86
    87    return 0;
    88} 

실행해보십시오. . .

$ g++ tbb.cpp -ltbb

$ head -n 2 random_data.txt 
"2019/07/02 00:00:00.033","2019/07/02 00:00:00","2019-07-02T00:00:00Z","841","68.104.166.4","25846","hY","142.2.153.83","51321","ip","O0I","4s38T52FF","TUy","uuYOm","MSBa7NoD","8","67RgzNBbmggPJsN5p5J7YxQou6","912","198","336","769","278","554","rand-pa1"
"2019/07/02 00:00:00.043","2019/07/02 00:00:00","2019-07-02T00:00:00Z","478","24.65.11.145","41214","0p","40.193.169.129","23907","Pz","Vh8","D7i2u4FKG","mUX","7Eupl","ZjBDfZbs","5","NheJki5vi0XlwrOVS8MFE9vgQ2","953","917","636","718","142","607","rand-pa1"

$ ./a.out random_data.txt 
1:80.7.36.18,87.202.209.244
2:84.197.61.38,28.31.35.245
3:149.38.245.191,71.153.59.69
4:244.201.242.36,3.140.138.200
5:69.208.33.205,206.26.44.221
6:20.174.210.174,191.70.14.196
7:158.40.105.63,35.52.152.35
8:93.16.76.199,193.99.45.197
9:70.146.59.78,77.21.128.75
10:250.210.21.183,47.166.17.227

조금 메모:

STL의 해시 맵을 병렬 처리에 사용하는 경우 화가 이루어지지 않기 때문에, 멀티 코어가 살지 않는 모양.

한편, Intel TBB의 해시 맵은 「무거운」이므로, 병렬화에 의한 효과가 순차 퍼포먼스보다 큰 경우에, 사용하면 좋다.

자세한 내용은 ↓ 참조
htps //w w. 미안해. 이. jp/보오 ks/9784873113555/
htps //w w. 아마존. 코 m / 니 l-Th 레아 ぢ g 뵈 l ぢ g - B ぉ cks 파라 ぇ ぃ sm / dp / 0596514808

"따라서 추가 된 병렬화가 더 느린 순차적 성능보다 중요하다면 고급 동시 컨테이너를 활용하십시오."
그리고 있다. (86페이지)

(`-)b

좋은 웹페이지 즐겨찾기