数组的内存使用
Memory usage of arrays
我正在开发一个 CSV 解析器,它应该能够在浏览器中处理巨大的数据集(读取 1000 万行)。
基本上解析器的工作方式如下:
主线程读取20MB的块,否则浏览器会很快崩溃。之后,将读取的数据块发送给其中一个工作人员。
worker收到数据,把我不要的列丢掉,我要的留存。通常我只想要 20-30 列中的 4-5 列。
worker将处理后的数据发回主线程
主线程接收到数据,保存到data数组中
重复步骤 1-4 直到文件完成。
在数据集 (crimes city of chicago) 的最后,我得到一个数组,其中包含 71 个其他数组,每个数组包含 +/- 90K 元素。这 90K 个元素中的每一个都包含 5 个字符串(从读取文件中提取的列)。即纬度、经度、年份、块和 IUCR。
总而言之,71 是数据集中 20MB 的块数,90K 是每个 20MB 块中的行数,5 是提取的列。
我注意到浏览器(Chrome)占用了过多的内存,所以我在4种不同的浏览器(Chrome、Opera、Vivaldi和Firefox)中进行了尝试,并记录了使用的内存选项卡。
- Chrome - 1.76GB
- 歌剧 - 1.76GB
- Firefox - 1.3GB
- 维瓦尔第 - 1GB
如果我尝试重新创建相同的数组但使用模拟数据,它只使用大约。 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倍多的内存。
我可以做些什么来减少解析器的内存使用量?
基本上可以使用一些技巧来使用更少的内存。
首先,CSV 中包含数字的列应按原样转换和使用。由于 Javascript 中的数字占用 8 个字节,但与字符串相同的数字可以占用更多 space(每个字符 2 个字节)。
另一件事是在工作完成后终止所有工人。
我正在开发一个 CSV 解析器,它应该能够在浏览器中处理巨大的数据集(读取 1000 万行)。
基本上解析器的工作方式如下:
主线程读取20MB的块,否则浏览器会很快崩溃。之后,将读取的数据块发送给其中一个工作人员。
worker收到数据,把我不要的列丢掉,我要的留存。通常我只想要 20-30 列中的 4-5 列。
worker将处理后的数据发回主线程
主线程接收到数据,保存到data数组中
重复步骤 1-4 直到文件完成。
在数据集 (crimes city of chicago) 的最后,我得到一个数组,其中包含 71 个其他数组,每个数组包含 +/- 90K 元素。这 90K 个元素中的每一个都包含 5 个字符串(从读取文件中提取的列)。即纬度、经度、年份、块和 IUCR。
总而言之,71 是数据集中 20MB 的块数,90K 是每个 20MB 块中的行数,5 是提取的列。
我注意到浏览器(Chrome)占用了过多的内存,所以我在4种不同的浏览器(Chrome、Opera、Vivaldi和Firefox)中进行了尝试,并记录了使用的内存选项卡。
- Chrome - 1.76GB
- 歌剧 - 1.76GB
- Firefox - 1.3GB
- 维瓦尔第 - 1GB
如果我尝试重新创建相同的数组但使用模拟数据,它只使用大约。 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倍多的内存。
我可以做些什么来减少解析器的内存使用量?
基本上可以使用一些技巧来使用更少的内存。
首先,CSV 中包含数字的列应按原样转换和使用。由于 Javascript 中的数字占用 8 个字节,但与字符串相同的数字可以占用更多 space(每个字符 2 个字节)。
另一件事是在工作完成后终止所有工人。