2012-12-12 87 views
0

我的系統涉及通過TCP套接字發送大量的數據和元數據。我發送一個包含各種元數據的單個對象,以及二十個字節的數組。到目前爲止,我一直在使用包含BufferedOutputStream的ObjectOutputStream處理小示例(130kB數組)。我試圖達到我的67MB數組目標,但ObjectOutputStream無法處理那麼多的數據。我能夠發送1MB數組,但writeObject()掛起2MB。如何通過套接字發送非常大的對象

我聽說DataOutputStream更快,但我寧願不必將我的元數據編碼爲字節並在另一側解碼。有沒有一個很好的選擇能夠快速發送非常大的物體?

編輯:每次寫入方法後

我已經使用復位()。我目前正在發送一個SignedObject,它包含我自己的Message對象,它包含了20個數組以及一些元數據字段。我寧願保留所有包裝,因爲它非常方便,但我知道分離可能是唯一的出路。話雖如此,我仍然需要確保所有傳輸都是安全的。

UPDATE:

所以我去吃午飯,回來了,決定我會嘗試找出事情是否掛在發送或接收端。然後它永遠不會掛斷。我可以繼續成功發送高達4MB的陣列,直到我用完堆(這是無關的,只是意味着我需要更好的計算機或更高效的處理)。所以我猜這個問題消失了?並不意味着我不需要更好的方式來傳遞這個,所以如果人們擁有它們,我會採取更多的想法。此外,我假設一旦我更新這個,它會停止再次工作...

+2

使用量子物理學森它瞬間? :-) 或者做它無聊的方式:壓縮 – theglauber

+0

定義「太慢」。 – jtahlborn

+1

你真的希望60MB數據的傳輸能夠立即發生嗎?不管你怎麼做(除非你可以壓縮或消除它的大部分),它會比較慢。這就是爲什麼我們沒有從互聯網等引導的電腦的一部分。 – cHao

回答

1

是否有一個很好的選擇,能夠很快發送非常大的物體?

使用ObjectOutputStream和發送對象之間的reset()。除非你只有幾MB的內存(在這種情況下你應該得到更多的內存),否則你不會有任何問題。

與自己編碼字節相比,ObjectOutputStream相當慢,但它可以很好地處理編碼。更有可能您的網絡上傳速度是您的限制因素。在本例中,發送約600 Mb/s的,而大多數[寬頻連接是約500 KB /秒(約1000倍更慢)

ServerSocket ss = new ServerSocket(0); 
Socket s = new Socket("localhost", ss.getLocalPort()); 
final Socket s2 = ss.accept(); 
ss.close(); 

new Thread(new Runnable() { 
    @Override 
    public void run() { 
     int count = 0; 
     long start = System.nanoTime(); 
     try { 
      ObjectInputStream in = new ObjectInputStream(
        new InflaterInputStream(s2.getInputStream())); 
      while (in.readObject() != null) count++; 
      s2.close(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     long time = System.nanoTime() - start; 
     System.out.printf("Read %,d objects in %.3f seconds%n", count, time/1e9); 
    } 
}, "reader").start(); 
ObjectOutputStream oos = new ObjectOutputStream(
     new DeflaterOutputStream(s.getOutputStream())); 
for (int i = 0; i < 20; i++) { 
    byte[] bytes = new byte[67 * 1000 * 1000]; 
    oos.writeObject(bytes); 
    oos.reset(); 
} 
oos.writeObject(null); // poison pill 
oos.close(); 
s.close(); 

打印

Read 20 objects in 21.644 seconds 
+0

聽起來好像OP正在發送一個大對象,因此在這種情況下復位可能不可用。 – jtahlborn

+0

@jtahlborn該OP說2 MB對象失敗。很難看出2MB可能太多了。將有數百個導致問題。 –

+0

@jtahlborn和彼得,請參閱編輯原始帖子。 –

相關問題