2015-07-03 14 views
9

Tôi có một đối tượng mà tôi đang cố gắng nén. Nó có dạngSự cố với nén trong javascript

[ 
    { 
    array 
    string 
    }, 
    { 
    array 
    string 
    }, 
    ... 
] 

Các mảng không dài quá 10-15, cực nhỏ so với các chuỗi (chúng là html, dài khoảng 170k). Các chuỗi mặc dù thường được lặp lại, hoặc có một lượng lớn các chồng chéo. Vì vậy, trực giác của tôi cho tôi biết giá trị nén phải là giá trị nén của 1 chuỗi, cộng thêm một chút.

Tôi JSON.đăng ký đối tượng này và cố nén.

Hầu hết các thư viện nén đều làm việc sai khi nén các chuỗi, vì máy chủ gửi cho tôi phiên bản nén của gzip 77kb, tôi biết nó có thể ít nhất là nhỏ.

gzip-js

LZMA-js

Đã làm một công việc tốt ra khỏi lẽ 15 thư viện tôi đã cố gắng.

Vấn đề là gzip-js là tuyến tính trong số chuỗi. Nhưng lzma làm điều này một cách chính xác, nơi nó chỉ tăng kích thước một chút.

Lzma-js (cấp 2) rất chậm (20s so với 1s gzip) khi nén 7mbs (khoảng 30 ~ chuỗi).

Có thư viện nén ngoài đó, nhanh bằng gzip nhưng không quy mô tuyến tính trên các chuỗi lặp lại không?

+1

Bạn có thể liệt kê những người đã làm một công việc tồi tệ mà bạn đã thử không?Nó chắc chắn sẽ tiết kiệm thời gian thiết lập lại của chúng tôi thời gian để không phải làm công việc tương tự bạn đã đi qua. –

+0

Bạn đã xem câu trả lời cho http://stackoverflow.com/questions/4570333/string-compression-in-javascript? Các câu trả lời được đánh giá hàng đầu liên kết đến trang này http://pieroxy.net/blog/pages/lz-string/index.html, tham chiếu đến một số lib nén lz –

+0

Nếu bạn có thời gian, bạn có thể chuyển đổi các bit thành hình ảnh (mọi 3 bit dưới dạng bixel) và lưu nó dưới dạng hình ảnh lossless png, hiệu suất tốt nhất với nén rất tốt –

Trả lời

1

Sử dụng gzip-js lib với mức nén cao
https://github.com/beatgammit/gzip-js

var gzip = require('gzip-js'), 
    options = { 
     level: 9, 
     name: 'hello-world.txt', 
     timestamp: parseInt(Date.now()/1000, 10) 
    }; 

// out will be a JavaScript Array of bytes 
var out = gzip.zip('Hello world', options); 

tôi thấy cách này là tối thiểu như kích thước posible với thời gian bình thường

Và đối với thuật toán nén LZ-based tôi nghĩ rằng LZ -string nhanh hơn
kiểm tra điều này trên mẫu dữ liệu của bạn
https://github.com/pieroxy/lz-string

1

Pako hữu ích cho tôi, hãy thử:

Thay vì sử dụng id chuỗi sử dụng byteArrays, như được thực hiện here.

Nhận pako.js và bạn có thể giải nén ByteArray như vậy:

<html> 
<head> 
<title>Gunzipping binary gzipped string</title> 
<script type="text/javascript" src="pako.js"></script> 
<script type="text/javascript"> 

// Get datastream as Array, for example: 
var charData = [31,139,8,0,0,0,0,0,0,3,5,193,219,13,0,16,16,4,192,86,214,151,102,52,33,110,35,66,108,226,60,218,55,147,164,238,24,173,19,143,241,18,85,27,58,203,57,46,29,25,198,34,163,193,247,106,179,134,15,50,167,173,148,48,0,0,0]; 

// Turn number array into byte-array 
var binData  = new Uint8Array(charData); 

// Pako magic 
var data  = pako.inflate(binData); 

// Convert gunzipped byteArray back to ascii string: 
var strData  = String.fromCharCode.apply(null, new Uint16Array(data)); 

// Output to console 
console.log(strData); 

</script> 
</head> 
<body> 
Open up the developer console. 
</body> 
</html> 

Chạy ví dụ: http://jsfiddle.net/9yH7M/

Hoặc bạn base64 có thể mã hóa các mảng trước khi bạn gửi nó qua như Array chiếm rất nhiều overhead khi gửi dưới dạng JSON hoặc XML. Giải mã tương tự như vậy:

// Get some base64 encoded binary data from the server. Imagine we got this: 
var b64Data  = 'H4sIAAAAAAAAAwXB2w0AEBAEwFbWl2Y0IW4jQmziPNo3k6TuGK0Tj/ESVRs6yzkuHRnGIqPB92qzhg8yp62UMAAAAA=='; 

// Decode base64 (convert ascii to binary) 
var strData  = atob(b64Data); 

// Convert binary string to character-number array 
var charData = strData.split('').map(function(x){return x.charCodeAt(0);}); 

// Turn number array into byte-array 
var binData  = new Uint8Array(charData); 

// Pako magic 
var data  = pako.inflate(binData); 

// Convert gunzipped byteArray back to ascii string: 
var strData  = String.fromCharCode.apply(null, new Uint16Array(data)); 

// Output to console 
console.log(strData); 

Chạy ví dụ: http://jsfiddle.net/9yH7M/1/

Đối với các tính năng tiên tiến hơn, đọc pako API documentation.

Các vấn đề liên quan