2013-04-28 279 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