2009-06-26 54 views
2

我正在從事一個在線遊戲,並且在服務器端工作時遇到了一些小麻煩。JAVA NIO ByteBuffer分配以適應最大的數據集?

在Java中使用非阻塞套接字時,處理完整分組數據集的最佳操作過程是什麼?在所有數據都可用之前無法處理完整分組數據集?例如,通過套接字發送大的2D平鋪地圖。

我能想到的兩種方法處理:

  1. 分配字節緩衝區大到足以處理來處理從我的例子大型2D瓷磚地圖所需要的完整的數據集。繼續將讀取數據添加到緩衝區,直到全部收到並從那裏進行處理。

  2. 如果ByteBuffer的大小較小(可能是1500),則可以完成後續讀取操作並將其發送到文件,直至完全從文件中處理完畢。這將防止必須擁有大型ByteBuffers,但由於磁盤I/O而降低性能。

我爲每個SocketChannel使用專用的ByteBuffer,這樣我就可以繼續讀取數據,直到完成處理。問題是,如果我的2D平鋪地圖大小爲2MB,使用1000個2MB ByteBuffers(假設1000是客戶端連接限制並且它們都在使用中)真的很明智嗎?必須有一個我沒有想到的更好的方式。

我寧願保持簡單,但我願意接受任何建議,並感謝您的幫助。謝謝!

回答

1

現在最好的解決方案可能是使用完整的2MB ByteBuffer,並讓操作系統負責分頁到磁盤(虛擬內存)(如果有必要的話)。您可能不會立即擁有1000個併發用戶,當您這樣做時,您可以優化。您可能會驚訝於您的真實表現問題。

+0

將Java堆大小調整爲如此大的大小是否可以接受?即使是100個連接也很容易將它的默認限制吹掉,而我的服務器會因OutOfMemory異常而崩潰。 – user126368 2009-06-26 04:04:36

0

我決定最好的行動方式是簡單地減少我的海量數據集的大小,併發送磁貼更新而不是整個地圖更新。這樣我就可以簡單地發送已在地圖上更改過的圖塊列表,而不是整個地圖。這減少了對這種大型緩衝區的需求,並且我回到了正軌。謝謝。