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

标签 arrays node.js serialization

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/

相关文章:

php - Node.js 聊天 - 用户身份验证

security - Node.js 应用程序的授权方法和设计模式

PHP unserialize() 偏移处错误

java - 包含多个对象的 ArrayList 的序列化,不保存对象状态

android - 如何将 byte[] 转换为 String 而不会在 Android 中出现内存不足错误?

html - Ruby 数组到 HTML 表格

javascript - 如何将存档 (zip) 通过管道传输到 S3 存储桶

c# - 由于格式化,XML 反序列化在十进制解析时崩溃

java - list.toArray() 同意将 A 类型的项目传输到 B[] 类型的数组

java - 如何确保添加到数组的对象的 ID 不存在而不出现 nullpointerException?