1
  • 使用平台:Apache Zeppelin
  • 语言:scala, javascript

我使用 d3js 读取大小约为 40MB 的 csv 文件,它与以下代码完美配合:

<script type="text/javascript">
d3.csv("test.csv", function(data) {
    // data is JSON array. Do something with data;
    console.log(data);
});
</script> 

现在,想法是避免使用 d3js,而是在 scala 中构造 JSONarray,并通过 z.angularBind() 在 javascript 代码中访问此变量。下面的两个代码都适用于较小的文件,但是对于大小为 40MB 的 CSV 文件会出现 java 堆空间错误。我无法理解的是,当 d3.csv() 可以完美地完成工作而没有任何堆空间错误时,为什么下面的这 2 个代码不能?

编辑代码 1:使用 scala 的

import java.io.BufferedReader;
import java.io.FileReader;
import org.json._
import scala.io.Source

var br = new BufferedReader(new FileReader("/root/test.csv"))
var contentLine = br.readLine();
var keys = contentLine.split(",")
contentLine = br.readLine();
var ja = new JSONArray();
while (contentLine != null) {
    var splits = contentLine.split(",")
    var i = 0
    var jo = new JSONObject()
    for(i <- 0 to splits.length-1){
        jo.put(keys(i), splits(i));    
    }
    ja.put(jo);
    contentLine = br.readLine();
}
//z.angularBind("ja",ja.toString()) //ja can be accessed now in javascript (EDITED-10/11/15)

编辑代码 2: 我认为如果我使用 Apache spark 像下面的代码那样构造 JSON 数组,堆空间问​​题可能会消失,但这也给出了堆空间错误:

def myf(keys: Array[String], value: String):String = {
    var splits = value.split(",")
    var jo = new JSONObject()
    for(i <- 0 to splits.length-1){            
        jo.put(keys(i), splits(i));
    }
    return(jo.toString())
}

val csv = sc.textFile("/root/test.csv")
val firstrow = csv.first
val header = firstrow.split(",")
val data = csv.filter(x => x != firstrow)

var g = data.map(value => myf(header,value)).collect()
// EDITED BELOW 2 LINES-10/11/15
//var ja= g.mkString("[", ",", "]") 
//z.angularBind("ja",ja) //ja can be accessed now in javascript
4

1 回答 1

0

您正在创建 JSON 对象。它们不是 java/scala 原生的,因此会在该环境中占用更多空间。z.angularBind() 到底是做什么的?

还有你的javascript环境的堆大小是多少(参见https://www.quora.com/What-is-the-maximum-size-of-a-JavaScript-object-in-browser-memory for chrome)和你的java 环境(请参阅如何确定默认的 java 堆大小?)。

更新:删除了我误解问题的答案的原始部分

于 2015-11-04T07:44:19.967 回答