2013-04-28 281 views
1

我在Java中遇到了一個問題,我一直在進行大約一週的時間。我試圖找到一種有效的方式,可以在不丟失數據的情況下,每秒在外部存儲上寫入90-120MB的數據。在我的測試中,我已經獲得了18-20MB/s這是外部存儲器的正常速度範圍,但是由於Android每個進程的堆爲140MB-256MB(使用largeHeap標記,我最多可獲得138MB),因此無法做出大的有足夠的緩衝區可以使用Java鏈接列表或數組保持數據的完整性(數據以90 + MB/s生成)。 JNI是一個很好的選擇,可以創建一個足夠大的循環數組或鏈表來在文件寫入時保持數據?我看到另一篇文章,其中有人建議在單獨的進程中運行服務以獲得「額外」內存。我只是擔心序列化會減慢生成的數據的傳輸速度。我已經沮喪地刪除了我的所有代碼。提前致謝。在Android中快速寫入大量數據文件

+0

我認爲你不會永遠寫入這麼多的數據量。那麼你可能會考慮AsyncTask?它需要一些時間,但它應該處理所有的數據。 – DuKes0mE 2013-04-28 20:03:06

回答

1

要寫90-120 MB/s,你需要一個支持這個數據速率的設備。注意:典型的硬盤驅動器無法做到這一點。

您可以添加一些額外的緩衝,但這是不可持續的。相反,我建議您找到一種方法,用較少的數據編寫相同的信息。例如通過壓縮數據。

順便說一句,JNI不會讓你的設備運行得更快,或給你更多的內存。

+0

謝謝,我認爲緩衝區在滿了之後會運行,因爲它不能從字面上趕上至少比數據給出的速度慢70MB/s。我需要分配一個至少有180MB大小的緩衝區,看起來只有C允許。我會研究壓縮比如gzip或其他數據。 – LKD 2013-04-28 20:42:00

+0

2秒鐘後,180 MB緩衝區將會填滿。我不明白爲什麼a)你需要它,因爲操作系統應該爲你緩衝未提交的寫入,b)不能在Java中分配180MB的緩衝區。如果你沒有這麼多的堆,你可以使用堆/本機/直接內存。或者甚至更好的是,你可以使用內存映射文件,這個文件既可以作爲一個大堆堆緩衝區使用,也可以用來寫入數據。 – 2013-04-28 20:50:25

+0

順便說一句,你的設備有多少可用內存。顯然你不能分配一個比這更大的有用緩衝區。 – 2013-04-28 20:52:03