» »

[js] json kompresija

[js] json kompresija

korenje3 ::

A kdo ve katera zadeva je najboljša za kompresiranje json podatkov. Uporabljam node.js.
i9-12900k; 32GB DDR5-6000 CL36; Nvidia RTX 3080 ti;
Gigabyte Aorus z690 master; Be Quiet Dark Power 12 1000W

infiniteLoop ::

Kako to mislis? Da bi uporabil cim manj presledkov in podobno? JSON.stringify opravi to za tebe automagicno. Kratek primer iz node REPL:

> var obj = {
....... a: 10,
....... b: {
......... c: 20,
......... d: '30'
......... }
....... }
undefined
> obj
{ a: 10, b: { c: 20, d: '30' } }
> JSON.stringify(obj);
'{"a":10,"b":{"c":20,"d":"30"}}'
None of us is as dumb as all of us.

korenje3 ::

zadevo sem rešil na tak način...

zapisovanje:

function savediskdata(vhod){
	if(nconf.get("vhodi:"+vhod+":type") === 'logger'){
		if(typeof intervalcount === 'undefined'){ continue; }
		if(typeof intervalcount[vhod] === 'undefined'){ continue; }
		if(typeof intervalcount[vhod].data === 'undefined'){ continue; }
		var logfile = nconf.get("vhodi:"+vhod+":options:logfile");
		if(! logfile){ continue; }
		(function(logfile){
			zlib.deflate(JSON.stringify(intervalcount[vhod].data), function(err, buffer) {
				if (!err) {
					fs.writeFile('./logs/'+logfile, buffer, function (err) {
						if (err) { console.log(err); }
					});
				} else {
					console.log(err);
				}
			});
		})(logfile);
	}
}


branje:

function loaddiskdata(vhod){
	if(nconf.get("vhodi:"+vhod+":type") === 'logger'){
		if(typeof intervalcount === 'undefined'){ return; }
		if(typeof intervalcount[vhod] === 'undefined'){ return; }
		if(typeof intervalcount[vhod].data === 'undefined'){ return; }
		var logfile = nconf.get("vhodi:"+vhod+":options:logfile");
		if(! logfile){ return; }
		(function(vhod){
			fs.readFile("./logs/"+logfile, function(err, data){
				if(err){ console.log(err); }
				else {
					zlib.unzip(data, function(err, data) {
						if (!err) {
							intervalcount[vhod].data = JSON.parse(data);
							for(i = 0; i < intervalcount[vhod].data.length; i++){
								if(intervalcount[vhod].data[i] !== null){
									if(intervalcount[vhod].data[i][0] !== null){
										intervalcount[vhod].data[i][0] = new Date(intervalcount[vhod].data[i][0]);
									}
								}
							}
						} else {
							console.log(err);
						}
					});
				}
			});
		})(vhod);
	}
}
i9-12900k; 32GB DDR5-6000 CL36; Nvidia RTX 3080 ti;
Gigabyte Aorus z690 master; Be Quiet Dark Power 12 1000W

Zgodovina sprememb…

  • spremenil: korenje3 ()

infiniteLoop ::

Eh tebe torej zanima kompresija podatkov kot taka in dejstvo da gre za JSON je samo postranska zadeva.... Drugic se poskusi malo bolj jasno izrazati.

Kako dolgo pa se ze ukvarjas z node.js?
None of us is as dumb as all of us.

korenje3 ::

2 meseca... node.js pa jquery na client side.

http://the-nox.com:8080
v cca 2 meseca mi je uspelo spisati 5000 vrstic node.js in jquery skripte :p
i9-12900k; 32GB DDR5-6000 CL36; Nvidia RTX 3080 ti;
Gigabyte Aorus z690 master; Be Quiet Dark Power 12 1000W

Zgodovina sprememb…

  • spremenil: korenje3 ()

keworkian ::

korenje3 je izjavil:

2 meseca... node.js pa jquery na client side.

http://the-nox.com:8080
v cca 2 meseca mi je uspelo spisati 5000 vrstic node.js in jquery skripte :p

Ne dela trenutno, slabo spisano :p
Obscenities in B-Flat

Gandalfar ::

Pozeni za foro gzip se cez, bos videl da se ti skoraj ne splaca uglifyat jsona.

Bramac ^^ ::

http://msgpack.org/ (samo serializacija).

Zgodovina sprememb…

korenje3 ::

Gandalfar je izjavil:

Pozeni za foro gzip se cez, bos videl da se ti skoraj ne splaca uglifyat jsona.


sej to sem naredil. json sem gzipal.
zlib.deflate(JSON.stringify(intervalcount[vhod].data), function(err, buffer) {

zadevo kompresira cca 40÷60%.

edini problem je, da rabi 200ms, da mi kompresira v 10kB veliko datoteko... bomo videli kako je kasneje, in če ta gzip kej blokira skripto. namreč tega bi se rad izognil, tako da lahko druge operacije delujejo medtem ko mi gzipa.
i9-12900k; 32GB DDR5-6000 CL36; Nvidia RTX 3080 ti;
Gigabyte Aorus z690 master; Be Quiet Dark Power 12 1000W

Zgodovina sprememb…

  • spremenil: korenje3 ()

infiniteLoop ::

Zaradi asinhrone narave node.js (javascripta) ne bi smelo nic blokirati. To je zame glavna stvar pri celi zadevi....
None of us is as dumb as all of us.

alexa-lol ::

keworkian je izjavil:

korenje3 je izjavil:

2 meseca... node.js pa jquery na client side.

http://the-nox.com:8080
v cca 2 meseca mi je uspelo spisati 5000 vrstic node.js in jquery skripte :p

Ne dela trenutno, slabo spisano :p


Dej strežnik zalaufi da vidmo zadevo

kunigunda ::

Caki ce rabis to za HTTP prenos server-client, pol ti ze sam HTTP server ponavadi zna kompresirat,
samo povedat mu moras. Nisem se nikoli igral s tem sicer.
HTTP compression @ Wikipedia

Gandalfar ::

Ja, to kar na nginx vklopis

infiniteLoop ::

Ce vzames minuto casa in preberes kodo (ki priznam ni pojem elegance) vidis, da tip hoce zapisati datoteko na disk.

Pa tudi drugace kompresija se ni razlog, da postavis spredaj nginx. Naprimer ce uporabljas express kar vklopis compress middleware. Vrstica kode in ciao.
None of us is as dumb as all of us.

korenje3 ::

kompresiram samo log fajle. za prenose preko mreže je bv kompresirat, ker so prenosi hitrejši kot kompresija.

infiniteLoop je izjavil:

Ce vzames minuto casa in preberes kodo (ki priznam ni pojem elegance) vidis, da tip hoce zapisati datoteko na disk.

Pa tudi drugace kompresija se ni razlog, da postavis spredaj nginx. Naprimer ce uporabljas express kar vklopis compress middleware. Vrstica kode in ciao.


kaj pa ni elegantnega na moji kodi? :P
i9-12900k; 32GB DDR5-6000 CL36; Nvidia RTX 3080 ti;
Gigabyte Aorus z690 master; Be Quiet Dark Power 12 1000W

Zgodovina sprememb…

  • spremenil: korenje3 ()

kunigunda ::

Ce imas log fajle zgolj za troubleshooting izklopi kompresiranje pa je, tud lazje je iskati pol znotri fajla,
delas dnevni fajl npr z datumom, pa nek schedule job, k ti jih zazipa ob polnoci.

korenje3 ::

log fajli so za shranjevanje meritev temperature, klikov ipd. kar se pač logira.
i9-12900k; 32GB DDR5-6000 CL36; Nvidia RTX 3080 ti;
Gigabyte Aorus z690 master; Be Quiet Dark Power 12 1000W

infiniteLoop ::

Jap kot pravi kunigunda, ce ni potrebe po hipni kompresiji datoteke, lahko to lepo obavis "offline" s programom a'la logrotate (zlata vredna stvar na voljo na *nix platformah).

Kar pa se elegance tice pa je tezko prek foruma. Ampak, ker si ze vprasal... Kar nekaj tistih "if" stavkov lahko eliminiras. Po mojem skromnem mnenju ti tudi ni treba uporabljati zavitih oklepajov za en samcat "return;". Uporaba hipnih funkcij (ta termin sem si ravno zmislil, upam, da je OK) je pogosto zazeljena ampak v obeh primerih v tvoji kodi je nepotrebna. Ce se ti koda zacne sposcati v "callback hell" si lahko pomagas z Async.js.
Je pa res da imajo vsake oci svojega malarja in to lahko naredi debate o eleganci precej jalove. Jaz se poskusam drzati "nothing left" principa.

Tolko za enkrat, pa veliko uzitkov pri kodiranju.
None of us is as dumb as all of us.

Zgodovina sprememb…

korenje3 ::

Ta kompresija na beaglebone black ni bila ravno pametna ideja. 13 sekund rabi da skompresira v 300kB zip fajl.

infiniteloop: trenutno se res ne bom ukvarjal z izgledom kode, ampak s funkcionalnostjo. potem ko bom imel vse narejeno, bom zadevo lepšal.
i9-12900k; 32GB DDR5-6000 CL36; Nvidia RTX 3080 ti;
Gigabyte Aorus z690 master; Be Quiet Dark Power 12 1000W

Zgodovina sprememb…

  • spremenil: korenje3 ()

BigWhale ::

infiniteLoop je izjavil:

Po mojem skromnem mnenju ti tudi ni treba uporabljati zavitih oklepajov za en samcat "return;".


To so rekli tudi pri Applu. :)

driver_x ::

korenje3 je izjavil:

Ta kompresija na beaglebone black ni bila ravno pametna ideja. 13 sekund rabi da skompresira v 300kB zip fajl.

infiniteloop: trenutno se res ne bom ukvarjal z izgledom kode, ampak s funkcionalnostjo. potem ko bom imel vse narejeno, bom zadevo lepšal.


Če je to tvoj hobi projekt, ki ga ne misliš deliti naokoli (kode), potem kodiraj tako, da bodo zadeve razumljive tebi.

RejZoR ::

Za take stvari je najboljši PPMd algoritem (high speeed simetričen, edino RAM zahteve so relativno visoke). Kako boš to implimentiral pa je druga stvar...
Angry Sheep Blog @ www.rejzor.com

infiniteLoop ::

BigWhale je izjavil:

infiniteLoop je izjavil:

Po mojem skromnem mnenju ti tudi ni treba uporabljati zavitih oklepajov za en samcat "return;".


To so rekli tudi pri Applu. :)


Heh naceloma sem pro curly, ampak ce je one liner ga stisnem na (hej kontroverzno) eno vrstico.

if (err) return next(err);


Ce pa zacnem tiscati kodo v naslednjo vrstico, potlej pa obvezno uporabim zavite oklepaje.
None of us is as dumb as all of us.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

PM2 (Node.js Process Manager) in uporabniki

Oddelek: Operacijski sistemi
6698 (634) dunda
»

Apache in Node.JS

Oddelek: Izdelava spletišč
91831 (1517) dunda
»

backbone.js

Oddelek: Programiranje
61101 (742) BigWhale
»

[js jquery] širina diva

Oddelek: Programiranje
141111 (979) alexa-lol
»

Masterpage in jQuery(ajax call)

Oddelek: Programiranje
61211 (1039) hatchette

Več podobnih tem