JSON.stringify 显然不节省空间。使用 Node.js 序列化和存储 float32array 的最优雅方法是什么?
编辑:人们出于“基于意见”和“缺乏对问题的理解”等原因关闭了这个问题。我真的相信第一个是误点击。对于第二个,也许这更清楚:
var fs = require("fs");
var len = 1000*1000*10;
var big_array = new Float32Array(len);
for (var i=0; i<len; ++i)
big_array[i] = Math.random();
// OBVIOUSLY NOT SPACE EFFICIENT \/
fs.writeFileSync("big_array.json",JSON.stringify(big_array));
它不节省空间,因为您将数字表示为字符串,所以一个 8 字节的 float 将使用大约 20 个 utf8 字符,这是一种浪费。问题是:如何以节省空间的方式存储数组?
最佳答案
最后我成功地用nodejs将float32array写入磁盘并在浏览器上检索它们,希望它能对你有所帮助。
在NodeJS中将Float32Array写入二进制文件
var fs = require('fs');
var wstream = fs.createWriteStream('data.dat');
var data = new Float32Array([1.1,2.2,3.3,4.4,5.5]);
//prepare the length of the buffer to 4 bytes per float
var buffer = new Buffer(data.length*4);
for(var i = 0; i < data.length; i++){
//write the float in Little-Endian and move the offset
buffer.writeFloatLE(data[i], i*4);
}
wstream.write(buffer);
wstream.end();
读取文件并在浏览器上将其转换为 Float32Array
var urlToFloatFile = 'data.dat';
var request = new XMLHttpRequest();
request.open('GET', urlToFloatFile, true);
//specify the response type as arraybuffer
request.responseType = 'arraybuffer';
request.onload = function (msg) {
var yourFloatData = new Float32Array(this.response);
console.log(yourFloatData);
};
request.send();
Thanks to @ben_a_adams from WebGL Dev List GGroup https://groups.google.com/forum/#!topic/webgl-dev-list/EbGUi_iSEx8 for the client side code
我创建了一个简单的测试来大致测试 float 组的 JSON 序列化与二进制表示有多少空间不同,结果是:
2.000.000 个浮点值
二进制文件 7.8MB
JSON 文件 38.5MB
Gzipped JSON 文件上的 17.5
关于arrays - 将 float32array 保存到 node.js 磁盘的紧凑方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20306750/