2012-12-12 86 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和彼得,请参阅编辑原始帖子。 –

相关问题