我使用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()可以完美地完成工作而没有任何堆空间错误时,为什么这些代码不能下面的代码?
已编辑的代码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
答案 0 :(得分: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环境(请参阅How is the default java heap size determined?)。
更新:删除了我误解了问题的答案的原始部分