- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个包含大约 12,000 个键/值对的序列文件。最大值为 143MB,其他均小于 1MB。 mapred.child.java.opts
设置为 -Xmx500m
.我得到一个 Error: Java heap space
在处理这个文件时。这是我的映射器:
public class MyMapper extends Mapper<Text, BytesWritable, Text, Text> {
@Override
protected void setup(Context context) throws IOException, InterruptedException {
super.setup(context);
}
@Override
protected void map(Text key, BytesWritable value, Context context) throws IOException, InterruptedException {
Configuration conf = context.getConfiguration();
String content = new String(value.getBytes());
// remove HTML tags (content is a HTML document)
String content_no_html = Jsoup.parse(content).text();
// try to find a regex match
}
}
}
我认为这可能是因为我的 Map 类正在将值从 BytesWritable 转换为 String,然后处理该字符串。但是我试图只在映射器中处理一个键/值对,如果 value.getLength() < 8388608
(8 MB),内存仍然不足。
我可以增加 -Xmx500m
,但我担心这不会解决我的问题,因为我有几千个序列文件需要处理而且我不知道最大的键/值对有多大(我对大的不感兴趣键/值对,因此是上面的 8MB 限制)。作为记录,我尝试了一些序列文件,导致 ~2500 个映射步骤,并且错误发生在第一个 1990 年左右成功之后,这让我认为单个键/值对大小是这里的问题.
有没有办法只将键/值对传递给 Mapper 达到大小限制?为什么我什至得到 Error: Java heap space
首先?
我尝试按照建议创建一个自定义的SequenceFileInputFormat,发现在调用map函数之前出现了Heap space error。准确地说,SequenceFileRecordReaders nextKeyValue()
是导致错误的原因。我通过运行一个什么都不做的 map 函数仔细检查了这一点,但它仍然崩溃了。我找不到修复那里错误的方法,所以我想增加内存是我在这里唯一的机会。
最佳答案
8 MB 的 HTML 仍然太大了!
例如,假设您的 8 MB html 文本是一个包含 80 字节长元素的 ul 列表,您将有 1,000,000 个元素:
<ul>
<li class="item" data-index="000000">This is the <b>first</b> line.</li>
<li class="item" data-index="000001">This is the <b>second</b> line.</li>
[...]
<li class="item" data-index="999999">This is the <b>last</b> line.</li>
</ul>
Jsoup Element
每个 li 元素的类(它是 Node
的子类)具有以下结构,我们可以从中估计(理论上和近似地)我示例的 html 列表的内存占用量:
LinkedHashMap<String, Attribute>
有 1 个条目(48 字节)
所以链表的单个元素占用的内存在580字节左右。
这 1,000,000 个元素使用的总内存约为 580 MB。
此外,主要的 ul 元素在其 childrenNodes 字段中包含对那些 li 元素的 1,000,000 个引用的列表,因此它需要 8 MB 的内存。
最后,当调用 text()
如果删除标签后留下的文本对应于 5MB 的序列化字符,那么您需要 String
500万char
s,占用 5,000,000*2 = 10 MB。
因此,如果您的 html 就像我显示的列表一样,那么您需要在对 map()
的单次调用期间存储在堆中。功能:
new String(value.getBytes())
=> ~ 16MBJsoup.parse(content)
=> ~ 590 MB.text()
=> ~ 10MB难怪你会得到一个只有 500 MB 的堆的 java 堆空间错误!
“内存爆炸”发生在用JSoup解析文件时,因为它要创建很多对象,而java对象,尤其是Strings,是很重的。
这完全取决于您的 html 的外观。如果您的 html 具有与我的示例大致相同的 html 标签/属性浓度,我认为您可以将阈值定义为 2 MB 左右以确保安全。
如果value.getLength() < 2_000_000
可以一开始就退出map函数和你一样。或者,如果不浪费数据对您来说很重要,您可以做一些更有趣的事情,比如运行正则表达式来计算 content
中标签或属性的数量。字符串。如果您有 20 MB 的文本,但其中只有 1 个标签,它仍然适合内存,无需跳过它。
关于java - Hadoop 序列文件 : process key/value only up to a certain size?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38081654/
我正在阅读 Python 文档以真正深入了解 Python 语言,并遇到了 filter 和 map 函数。我以前使用过过滤器,但从未使用过映射,尽管我在 SO 上的各种 Python 问题中都见过这
当我尝试打印 BST 的级别顺序时,这个问题提示了我。 这是一个 Pre-Order Sequence: 4, 1, 2, 3, 5, 6, 7, 8 In_order Sequence : 1, 2
我的代码在 main(序列测试;)的第一行出现错误,指出它是对 sequence::sequence() 的 undefined reference 。我无法更改 main 中的代码。有谁知道我该如何
这可能很简单,但我在通常的 latex 指南中找不到任何相关内容。在这句话中: {\em hello\/} “\/”的目的是什么? 最佳答案 这就是所谓的斜体校正。其目的是确保斜体文本后有适当的间距。
当我从 Postgresql 表中删除所有记录,然后尝试重置序列以在插入时开始一个编号为 1 的新记录时,我得到不同的结果: SELECT setval('tblname_id_seq', (SELE
在版本10.0.3中,MariaDB引入了一种称为序列的存储引擎。 其ad hoc为操作生成整数序列,然后终止。 该序列包含正整数,以降序或升序排列,并使用起始,结束和递增值。 它不允许在多个查询中
如何在 Groovy 中获取给定数字的序列,例如: def number = 169 // need a method in groovy to find the consecutive number
基本上,如果这是 .NET,它看起来像这样: ISomething { string A { get; } int B { get; } } var somethings = new List
说以下代码部分(同一块): A <= 1 A <= 2 变量 A 总是被赋值为 2 吗?还是会出现竞争条件并分配 1 或 2? 我对非阻塞赋值的理解是,由硬件在 future 分配变量 A,因此它可能
在运行 WiX 设置时,我正在寻找操作列表及其顺序。不知何故,官方网站似乎没有提供任何信息。 基本问题是我想正确安排我的自定义操作。通常我需要使用 regsvr32.exe 注册一个 DLL,而这只能
F#初学者在这里 我想创建一个类型,它是具有至少一个元素的另一种具体类型(事件)的序列。任何其他元素都可以在以后随时添加。通常在 C# 中,我会创建一个具有私有(private) List 和公共(p
作为构建过程和不断发展的数据库的一部分,我试图创建一个脚本,该脚本将删除用户的所有表和序列。我不想重新创建用户,因为这将需要比所允许的更多的权限。 我的脚本创建了一个过程来删除表/序列,执行该过程,然
我想恢复两个向量的第一个日期和相同向量的第二个日期之间的日期序列,.... 这是一个例子: dates1 = as.Date(c('2015-10-01', '2015-03-27', '2015-0
这个问题已经有答案了: sql ORDER BY multiple values in specific order? (12 个回答) 已关闭 9 年前。 我有一个 sql 语句,我想要ORDER
我想恢复两个向量的第一个日期和相同向量的第二个日期之间的日期序列,.... 这是一个例子: dates1 = as.Date(c('2015-10-01', '2015-03-27', '2015-0
在用java编写代码时,我需要用“],[”分割字符串。下面是我的代码。 try (BufferedReader reader = new BufferedReader(new InputStreamR
这个问题已经有答案了: Project Euler Question 14 (Collatz Problem) (8 个回答) 已关闭 9 年前。 我正在尝试查找数字的 Collatz 序列。以下
我有一个例程函数process_letter_location(const char& c, string &word)。 在我的 main 中,我声明了一系列字符串变量,如下所示: string s
我需要找到最长的多米诺骨牌链,给定一组 12 个随机挑选的多米诺骨牌。我已经递归地生成了多米诺骨牌的所有可能性(使用 0 到 12 的面值有 91 种可能性)。多米诺骨牌由一 block “砖 blo
我有这个数据结构 Seq,它继承了类 vector 但有一些额外的功能。使用这个数据结构 Seq 我有这个预定义的数据结构: typedef Seq > MxInt2d; 我现在想要一个包含多个 Mx
我是一名优秀的程序员,十分优秀!