Intel TBB의 Concurrent Hashmap을 사용해보기
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
Reference
이 문제에 관하여(Intel TBB의 Concurrent Hashmap을 사용해보기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Ruo_Ando/items/63f0d473f18164472465텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)