读取巨大的csv文件,然后使用d3

时间:2018-10-29 12:29:35

标签: javascript d3.js

我正在使用d3加载巨大的CSV文件,以后将其用于某些处理。我想加载文件并根据某些条件填充Map

我的csv文件就是这样

h1    h2    h3    h4
1     A     3     4
2     A     1     6
1     B     5     7
2     C     8     19

,依此类推。可能大约有4M个条目。

我想从此csv数据中填充地图。地图应该是这样

1 A : [3, 4]
2 A : [1, 6]
1 B : [5, 7]
2 C : [8, 19]

密钥必须是h1h2的组合。其他列将作为值添加。

我能够使用以下代码实现这一目标

function makeKey(a, b) {

    return "" + a + " " + b;
}

function csvToColumnArrays(csv) {

    let csvMap = new Map();

    for (let i = 0; i < csv.length; i++) {


        let data = csv[i];

        let value = [];
        value.push(parseFloat(data["h3"]));
        value.push(parseFloat(data["h4"]));

        let key = makeKey(data["h1"], data["h2"]);

        csvMap.set(key, value);

    }

    return csvMap;

}




d3.csv(file_url, function(csv) {

    let csvMap = csvToMap(csv);

}

这是2M大小的完美文件。但是,当大小进一步增加时,页面就会卡住。

有没有更有效的方法?

1 个答案:

答案 0 :(得分:1)

制作包含4M条目的字典不会使我的计算机崩溃。

sqlContext.sql("""   
   SELECT c.id
      ,c.course
      ,NVL(f.amount, 'N/A')
      FROM course c
      LEFT OUTER
      JOIN fee f 
      ON f.id = c.id
    """).show()

使用var count = 4 * 1000 * 1000; var map = {} for (var i=0; i < count; ++i) { map["" + i + "ABCDEF"[i%6] ] = [ Math.random(), Math.random() ]; } //console.log(map); console.log("done!");

new Map()