2015-03-19 77 views
1

我通過tcp/ip傳輸大數據時遇到了問題。要傳輸的字節向量的大小總是大約500000.我有2個解決方案來處理這個問題,但我不知道什麼是更好的或有另一種解決方案。C++:通過tcp/ip在發送字節中使用向量的最佳方法

對於2個解決方案,我有2個類來存儲數據。每個班有2種方法是:

  1. push(std::vector<BYTE_T& data>);
  2. vector<BYTE_T >pop();

#define BYTE_T unsigned char

方法1:使用vector<BYTE_T>

class buffDdata1 { 
     vector<BYTE_T> listData; 
     vector<BYTE_T> listDataTmp; 
public:  
    buffDdata1() { 
     listData.reserver(500000); 
     listDataTmp.reserver(500000); 
    } 
void push(vector<BYTE_T>& data) { 
    lock(); 
    listData.insert(listData.end(), data.begin(), data.end()); 
    unlock(); 
} 

vector<BYTE_T>& pop() { 
      lock(); 
      listDataTmp.clear(); 
      listDataTmp.swap(listData); 
      unlock(); 
      return listDataTmp; 
} 
}; 

方式2:使用

class buffData2 { 

     vector<vector <BYTE_T> > listData; 
     int nCount; 
public: 
     buffData2() { 
      listData.reserver(200000); 
     } 
     void push(vector <BYTE_T>& data) { 
      lock(); 
      listData.push_back(data);nCount++; 
      unlock(); 
     } 
     vector <BYTE_T> pop() { 
      vector <BYTE_T> listRet; 
      lock(); 
      for(int i=0; i< nCount; ++i) { 
       listRet.insert(listRet.end(), listData[i].begin(), listData[i].end()); 
      } 
      unlock(); 
      return listRet; 
     } 
}; 
+0

你有一個向量的每個字節?!?! – marsh 2015-03-19 03:05:33

+0

爲什麼要建立列表或堆棧呢?只需直接寫入字節即可。我甚至不明白爲什麼你有'vector 。' – EJP 2015-03-19 03:29:29

+1

@EJP這段代碼提供了一種合理的方式讓應用以線程安全的非阻塞方式累積數據,這樣'push()'工作線程不必擔心混合的部分發送,重試和/或阻塞。不是很好的代碼,但它確實有一定的用處。 – 2015-03-19 03:44:54

回答

0

路1具有推動螺紋追加數據,同時保持所述鎖(故推動是O(N)中的字節數),而方式2具有O(1)推但更多的工作以後爲彈出線程(以及整個鎖定)。

哪一個更好取決於你的工作性質 - 但它很複雜,而且它的意義令人懷疑,你應該簡單地在你的實際工作負載中進行配置。

還有其他的選擇 - 例如,特別是如果你的平均推送是合理的大小(例如千字節或更多) - 你可以使用方法2並返回矢量向量 - 讓每個輪流代碼輪流發送,而不花費將它們整合到更大的應用程序緩衝區中的時間。無論如何,你的TCP實現將整合它們(如果你發送它們的速度足夠快,例如Naggle算法不會不耐煩並且發送當時可用的內容)。

另外,你不需要nCount - vector的expose他們size(),並listData.reserve(200000);似乎真的過度 - 不,它很可能無關緊要。

+0

感謝Tony D提供的答案。我的問題是要傳輸的數據不斷且非常大。矢量大小總是被推到50000.那麼你能幫我構造數據嗎? – MaiKy 2015-03-19 06:22:47

+0

@MaiKy:所以 - 你發送了很多數據......爲什麼會有這個問題?你想讓它產生得更慢,所以你的程序使用更少的內存?你不覺得'pop()'平臺代碼已經儘可能快地發送了嗎?什麼樣的「結構」可能會疊加在字節流中的字符塊上?在我能夠想象的唯一意義上添加「結構」爲時已晚 - 指導反序列化的數據 - 需要在「推」之前完成。我不明白你的具體實際問題。 – 2015-03-19 06:28:04

相關問題