数组的内存使用情况

时间:2017-05-21 17:04:52

标签: javascript arrays browser dynamic-arrays

我正在开发一个CSV解析器,它应该能够在浏览器中处理大量数据集(读取1000万行)。

基本上解析器的工作方式如下:

  1. 主线程读取20MB的块,否则浏览器会快速崩溃。之后,将读取的数据块发送给其中一个工作人员。

  2. 工作人员接收数据并丢弃我不想要的列并保存我想要的列。通常情况下,我只想要20-30中的4-5列。

  3. 工作人员将处理后的数据发送回主线程。

  4. 主线程接收数据并将其保存在数据数组中。

  5. 重复步骤1-4直到文件完成。

  6. 在数据集(crimes city of chicago)的最后,我最终得到一个数组,里面有71个其他数组,每个数组都包含+/- 90K元素。这些90K元素中的每一个都包含5个字符串(从读取文件中获取的列)。即纬度,经度,年份,区块和IUCR。

    总结一下,71是数据集中20MB的块数,90K是每个块中20MB的行数,5是提取的列。

    我注意到浏览器(Chrome)使用了太多内存,因此我试用了4种不同的浏览器(Chrome,Opera,Vivaldi和Firefox),并记录了标签使用的内存。

    1. Chrome - 1.76GB
    2. Opera - 1.76GB
    3. Firefox - 1.3GB
    4. Vivaldi - 1GB
    5. 如果我尝试使用模拟数据重新创建相同的数组,它只使用约。 350MB的内存。:

      var data = [];
      for(let i = 0; i < 71; i++){
          let rows = [];
          for(let j = 0; j < 90*1000; j++){
              rows.push(["029XX W MADISON ST", "2027", "-87.698850575", "2001", "41.880939487"])
          }
          data.push(rows);
      }
      

      据我所知,如果数组是静态的,如上面的代码所示,它比动态情况更容易执行。但我并不期望为相同数量的数据使用5倍以上的内存。

      我可以做些什么来在解析器上使用更少的内存?

1 个答案:

答案 0 :(得分:0)

基本上使用较少的内存可以使用一些技术。

首先,应该转换包含数字的CSV列并将其用作此类。由于Javascript中的数字占用8个字节,但与字符串相同的数字可以占用更多空间(每个字符2个字节)。

另一件事是在工作完成后终止所有工人。