什么是在node.js上将float32array保存到磁盘的紧凑方法?

Mai*_*tor 5 arrays serialization node.js

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<len; ++i)
    big_array[i] = Math.random();

// OBVIOUSLY NOT SPACE EFFICIENT \/
fs.writeFileSync("big_array.json",JSON.stringify(big_array));
Run Code Online (Sandbox Code Playgroud)

它不是空间效率,因为你将数字表示为字符串,因此8字节浮点数将使用~20 utf8字符,这是一种浪费.问题是:如何以节省空间的方式存储阵列?

mar*_*v00 11

最后我设法用nodejs将float32array写入磁盘并在浏览器上检索它们,我希望它能帮到你.

将Float32Array写入NodeJS中的二进制文件

    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();
Run Code Online (Sandbox Code Playgroud)

读取文件并将其转换为浏览器上的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();
Run Code Online (Sandbox Code Playgroud)

感谢来自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文件上


小智 5

简单、干净的方法:

const float32Array = new Float32Array([.69,.420])
const buffer = Buffer.from(float32Array.buffer)
fs.writeFileSync(filePath, buffer)
const loadedBuffer = fs.readFileSync(filePath)
const newFloat32Array = new Float32Array(loadedBuffer.buffer)
Run Code Online (Sandbox Code Playgroud)


Chr*_*itz 0

我相信你可以使用 Meteor 的 EJSON:

http://docs.meteor.com/#ejson

https://npmjs.org/package/meteor-ejson

EJSON是JSON的扩展,支持更多类型。它支持所有 JSON 安全类型,以及:

  • 日期(JavaScript 日期)
  • 二进制(JavaScript Uint8Array 或 EJSON.newBinary 的结果)
  • 用户定义类型(请参阅 EJSON.addType。例如,Meteor.Collection.ObjectID 就是通过这种方式实现的。)