我们都被OutOfMemory
的错误打败了。如果我们存储的字符超过String
限制,如果我们超出StringBuffer
限制,如果我们超出ArrayList
限制等,则会发生这种情况。有一个很大的清单。但值得注意的是,世界上最大的大数据项目都是用Java构建的,包括亚马逊。所以我有一个问题。 Java可以在内存中存储70 MB的文件吗?此文件包含文本,此文件的每一行都将保存为LinkedList
中的元素。因此,如果文件有200,000行,LinkedList
将有200,000个元素。想象一下,我有一个4-5 GB的RAM。
Java可以处理这样的事情而不抛出OutOfMemory
吗?我不想手动调整堆大小。
你有什么建议?
更新
不要瞄准70MB。想象一下,这个填充量为300GB。我有一个500 GB的RAM(是的,我在一个大数据项目,RAM比这还要大)。现在怎么样?
答案 0 :(得分:2)
通过在程序启动时添加以下参数,可以更改Java虚拟机(JVM)在运行程序时的内存量。
-Xms<initialSize>
-Xmx<maxSize>
将initialSize
和maxSize
替换为符合您要求(和限制)的内容。
示例强>
以下将运行HelloWorld.class,初始堆大小为64 MB,最大堆大小为256 MB。
java -Xms64m -Xmx256m HelloWorld
答案 1 :(得分:1)
答案是什么? “这取决于”,因为代际记忆模型。
OutOfMemoryError
通常发生在你消耗烫发时,而不是整体记忆。
您的操作系统也有效果。 32位JVM现在允许大于1.2-1.5GB的堆,因为操作系统和JVM占用它们的份额。
64位操作系统和JVM将为您提供更多的堆RAM。
StringBuffer和List的唯一限制是索引和大小的整数(Integer.MAX)。
答案 2 :(得分:0)
是的,Java可以轻松地在内存中存储70MB的文件
答案 3 :(得分:0)
从文件处理大量数据时,缓冲始终是一个合理的答案:您几乎不需要在内存中加载完整的1-10-100 GB文件,但只需要加载小块。如果你这样做,你应该重新考虑你的设计。
此外,只有当您可以使用便利硬件(便宜的低端服务器)时,扩展“大数据”系统才具有成本效益,其中可用资源,内存等受限(每台机器认为低于16 GB,甚至更低) ,一些早期的测试使用只有2 GB RAM的机器,如Google的MapReduce原始论文所述。
遵循上述想法,大多数基于Java(而非)的大数据技术很可能永远不需要在内存中加载大量数据。例如,Hadoop处理单个数据行,一旦完成就将结果转储回磁盘。
因此,除非您的文件中每行的大小为4 GB,否则这不是问题。如果你这样做,你应该重新思考你的设计,数据收集策略,基础设施,或者挑出邪恶的思想,他们认为以这种方式组织你的数据是一个好主意。
最后,为了具体解决您的问题,如果您有一台500 GB RAM的服务器,为什么不运行某些测试?尝试不同的文件大小,不同的文件类型(JSON,XML,普通,CSV)和不同的加载方式(扫描仪,缓冲读取器等)并将数据保存在内存中(地图,字符串列表,类似DOM的对象,等等。)。那么请与我们分享您的发现,因为这听起来很有趣!