我正在开发一个CSV解析器,它应该能够在浏览器中处理大量数据集(读取1000万行)。
基本上解析器的工作方式如下:
主线程读取20MB的块,否则浏览器会快速崩溃。之后,将读取的数据块发送给其中一个工作人员。
工作人员接收数据并丢弃我不想要的列并保存我想要的列。通常情况下,我只想要20-30中的4-5列。
工作人员将处理后的数据发送回主线程。
主线程接收数据并将其保存在数据数组中。
重复步骤1-4直到文件完成。
在数据集(crimes city of chicago)的最后,我最终得到一个数组,里面有71个其他数组,每个数组都包含+/- 90K元素。这些90K元素中的每一个都包含5个字符串(从读取文件中获取的列)。即纬度,经度,年份,区块和IUCR。
总结一下,71是数据集中20MB的块数,90K是每个块中20MB的行数,5是提取的列。
我注意到浏览器(Chrome)使用了太多内存,因此我试用了4种不同的浏览器(Chrome,Opera,Vivaldi和Firefox),并记录了标签使用的内存。
如果我尝试使用模拟数据重新创建相同的数组,它只使用约。 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倍以上的内存。
我可以做些什么来在解析器上使用更少的内存?
答案 0 :(得分:0)
基本上使用较少的内存可以使用一些技术。
首先,应该转换包含数字的CSV列并将其用作此类。由于Javascript中的数字占用8个字节,但与字符串相同的数字可以占用更多空间(每个字符2个字节)。
另一件事是在工作完成后终止所有工人。