JSON.stringify显然不是节省空间的.使用Node.js序列化和存储float32array的最优雅方法是什么?
编辑:人们正在结束这个问题,原因包括"基于意见"和"对问题缺乏了解".我认真地相信第一个是missclick.对于第二个,也许这使得它更清楚:
var fs = require("fs"); var len = 1000*1000*10; var big_array = new Float32Array(len); for (var i=0; i它不是空间效率,因为你将数字表示为字符串,因此8字节浮点数将使用~20 utf8字符,这是一种浪费.问题是:如何以节省空间的方式存储阵列?
最后我设法用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();
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();
感谢来自WebGL Dev List GGroup的@ben_a_adams https://groups.google.com/forum/#!topic/webgl-dev-list/EbGUi_iSEx8,了解客户端代码
我创建了一个简单的测试来测试浮点数组的JSON序列化与二进制表示的差异大小,结果如下:
2.000.000浮点值
二进制文件上的7.8MB
JSON文件上有38.5MB
17.5在Gzipped JSON文件上