如何使用textFile避免"出堆空间"?

时间:2015-12-05 01:39:44

标签: scala apache-spark

我在文本文件中有以下数据

AAAA 0000 0.548 1.008 15.994

AAAB 0001 0.654 4.543 12.994

AAAB 0001 0.126 2.222 14.954

(约300K行)

我将数据收集到一个数组中,如下所示

       val logData = sc.textFile("data.txt",2).collect

现在我想将所有第3个字段和第5个字段相乘并将它们存储在另一个数组中,就像这样

0.548 * 15.994

0.654 * 12.994

等等

并将输出存储在一个单独的数组中。为此我使用了

       val arr = logData.map(item => item(2).toFloat*item(4).toFloat)

无论我增加多少堆大小,它都会给出Out of Heap Space错误。

以上述方式编码是否合适,还是有其他有效的方式

2 个答案:

答案 0 :(得分:0)

作为变种你可以做到:

val arr:Array[Float] = Source
  .fromFile("data.txt")
  .getLines()
  .map(
    line => {
      val split = line.split(" ")
      split(2).toFloat * split(4).toFloat
    }
  ).toArray

我已经运行这个代码存档300k行没有任何内存调整

答案 1 :(得分:0)

collect时删除对textFile的调用,因此它不是驱动程序的“作业”,而是执行程序来计算结果。

使用collect,您可以将整个文件有效地加载到驱动程序的内存中,该内存可能只需1G。