2013-02-18 1 views
0

분산 컴퓨팅 설정에서 많은 노드에 unordered_set을 보내려고합니다. C++의 직렬화에 대해 알고 있습니다. boost::serialization을 사용합니다. 직렬화 된 쇠고기는 직렬화 된 데이터를받은 후 모든 노드에서 unordered_set 데이터 구조를 다시 작성하는 데 드는 비용에 직면하고 있습니다.C++ 직렬화를 사용하지 않고 unordered_set *의 바이트 표현을 가져옵니다

내 아이디어는 고정 된 크기의 인접한 메모리를 할당하고 할당 후 시작 메모리 주소를 반환하는 unordered_set에 대한 사용자 지정 할당자를 작성하는 것입니다. 그런 다음 unordered_set의 바이트 표현을 가져 와서 와이어를 통해 전송하고 수신 노드에이 메모리 덩어리가 unordered_set임을 알리고 싶습니다.

그게 가능할까요? 너희들은 내 문제를 해결할 수있는 대안적인 아이디어가 있니? 또는 관련 포인터가 있습니까? 그런 할당자를 쓰는 것에? 모든 의견을 보내 주시면 감사하겠습니다.

감사합니다.

답변

5

이 아마 몇 가지 이유에 대한 나쁜 생각이다 :

  1. 종종 다음에 하나의 시스템에서 해시의 구현은 그래서 당신의 해시 테이블이 수신에 더 이상 유효하지 않을 것, 다른 것입니다 기계.
  2. 해시 테이블 구현에는 종종 포인터가 포함됩니다. 한 컴퓨터에서 다른 컴퓨터로 포인터를 복사 할 수는 없습니다. 그들은 절대 주소입니다 (대부분의 플랫폼에서).
  3. 송신 기계와 수신 기계가 서로 다른 바이트 순서를 가질 수 있습니다 (송신 기계가 x86이고 수신 기계가 POWER (예 : XBox)라고 할 수 있습니다.이 경우 얻을 수있는 결과는 완전히 횡설수설합니다.

난 그냥, 수신 측에 건설 해시 테이블에 삽입. 또한

를. 키/값 쌍의 목록을 보내 종종 와이어 처리 능력을 통해 뭔가를 보낼 때 염두에 두어야 할 비용은 대역폭 비용에 비해 미미합니다. 해시 테이블은 비효율적입니다. 거의 O (1) 성능을 유지하려면 많은 양의 버킷이 필요합니다. 전체적인 성능은 비록 당신이 와이어를 통해 해시 테이블을 보내는 방법을 구현할 수 있다고하더라도 더 나빠질 것입니다.

+0

의견을 보내 주셔서 감사합니다. 1 + 3) 모든 기계에는 동일한 하드웨어 + 소프트웨어가 있습니다. 2) 예, 그게 문제입니다. 저는 그걸 어쨌든 피하려고합니다. 상대 주소를 사용하여. 따라서 키 - 값 쌍을 보내는 것만으로도 직렬화가 다시 시작될 수 있지만 결국 궁극적으로 갈 길이 ... 다시 한번 감사드립니다! – Christian

+0

@Christian : 내부적으로 'unordered_map'에 접근 할 수 없기 때문에 상대 주소를 사용할 수 없습니다. –

+0

@Christian : 동일한 소프트웨어라도 많은 해시 테이블 해시가 공격자가 선택한 데이터 DoS 공격을 더 어렵게 만들기 위해 무작위성을 주입합니다. (즉, 공격자가 서비스에 높은 부하를 가하기 위해 해시 테이블의 최악의 O (n) 사례를 강제하도록 특별히 설계된 일부 데이터를 작성하는 경우) –