stocare persistent eficientă pentru ID-ul simplu la tabelul de valori hartă pentru Java

voturi
5

Am nevoie pentru a stoca date care urmează modelul simplu de cartografiere un „id“ la o masă plină (cu mai multe rânduri) de mai multe coloane (adică unele valori întregi [u, v, w]). Dimensiunea unuia dintre aceste tabele ar fi un cuplu de KB. Practic ceea ce am nevoie este de a stoca un cache persistentă a unor rezultate intermediare.

Acest lucru ar putea fi destul de ușor de implementat ca sql simplu, dar există o serie de probleme, și anume am nevoie pentru a comprima dimensiunea acestei structuri pe disc cât mai mult posibil. (Din cauza cantitatea de valori Sunt stocare) De asemenea, nu este tranzacțional, am nevoie doar să scrie și să citească o dată, pur și simplu conținutul întregului tabel, astfel încât un DB relațională nu este de fapt o potrivire foarte bună.

Mă întrebam dacă cineva a avut orice sugestii bune? Din anumite motive, nu pot par să vină cu ceva decent atm. Mai ales ceva cu un API în Java ar fi frumos.

Întrebat 12/03/2009 la 14:11
sursa de către utilizator
În alte limbi...                            


7 răspunsuri

voturi
1

Te - ai uitat la Berkeley DB ? Asta sună ca ar putea potrivi proiectul de lege.


Editați | ×:

Am uitat să adăugați vă puteți gzip valorile ei înșiși înainte de a le stoca. Apoi, dezarhivați-le doar atunci când le preluați.

Publicat 12/03/2009 la 14:14
sursa de către utilizator

voturi
3

Acest lucru sună ca un loc de muncă pentru .... new ObjectOutputStream(new FileOutputStream(STORAGE_DIR + "/" + key + ".dat");!!

Serios - cea mai simplă metodă este de a crea un fișier pentru fiecare tabel de date pe care doriți să stocați, serializa datele în și uite-l folosind cheia ca numele fișierului atunci când doriți să citiți.

Pe un fișier decent sistem poate fi scrieri făcute atomice (prin scrierea într - un fișier temporar și apoi redenumirea fișierului); Viteza de citire / scriere este măsurată în 10s de Mbit / secundă; arata up - uri pot fi făcute foarte eficient prin crearea unui copac director simplu , cum ar fi , STORAGE_DIR + "/" + key.substring(0,2) + "/" + key.substring(0,4) + "/" + keycare ar trebui să fie în continuare eficient cu milioane de intrări și chiar mai eficient în cazul în care sistemul de fișiere utilizează directoare indexate; în cele din urmă trivial de a pune în aplicare o memorie cache sprijinit-LRU pe partea de sus a acestui pentru extragerilor chiar mai repede.

În ceea ce privește compresie - puteți utiliza Jakarta Commons compresa pentru a afecta un gzip sau bzip2 de compresie chiar și la datele înainte de a le stoca. Dar aceasta este o problemă de optimizare și în funcție de aplicație și de spațiul disponibil pe disc ar putea fi mai bine să investească ciclurile CPU în altă parte.

Aici este o implementare de probă pe care am făcut: http://geek.co.il/articles/geek-storage.zip . Acesta folosește o interfață simplă (care este departe de a fi curat - ei doar o demonstrație a conceptului) , care oferă metode pentru stocarea și regăsirea obiectelor dintr - o memorie cache cu o dimensiune maximă stabilită. Un cache dor este transferat la o implementare de utilizator pentru manipulare, iar cache - ul va verifica periodic că aceasta nu depășește cerințele de stocare și va elimina datele vechi.

Am inclus, de asemenea, o punere în aplicare MySQL sprijinit pentru finalizarea și un punct de referință pentru a compara discul bazat și implementări bazate pe MySQL. Pe masina mea acasă (un vechi Athlon 64) discului de referință scorurile mai bine, apoi de două ori mai rapid ca implementarea MySQL în benchmark închis (9,01 secunde vs. 18.17 secunde). Chiar dacă punerea în aplicare PB, probabil, se poate optimizat pentru o performanță puțin mai bună, cred că demonstrează problema destul de bine.

Simțiți-vă liber pentru a utiliza acest lucru ca tu de cuviință.

Publicat 12/03/2009 la 14:28
sursa de către utilizator

voturi
2

Mi - ar folosi EHCache , este folosit de hibernare și de alte biblioteci Java EE, și este foarte simplu și eficient:

Pentru a adăuga un tabel:

List<List<Integer>> myTable = new(...)
cache.put(new Element("myId", myTable));

A citi:

List<List<Integer>> myTable = (List<List<Integer>>) cache.get("myId").getObjectValue();
Publicat 12/03/2009 la 14:29
sursa de către utilizator

voturi
1

Apache Derby ar putea fi o alegere bună dacă doriți ceva încorporat (nu un server separat).

Există o listă de alte opțiuni la Baze de Date ușoare în Java

Publicat 12/03/2009 la 14:47
sursa de către utilizator

voturi
0

Se pare ca cheie Baze de date => Valoare sunt lucru pe care îl căutați.

Poate SuperCSV este cel mai bun cadru pentru tine!

Dacă nu doriți să utilizați o bază de date relațională, puteți utiliza JAXB pentru a stoca obiecte ca fișiere XML!

Există , de asemenea , o modalitate cu alte biblioteci , cum ar fi XStream

Dacă preferați XML, apoi utilizați JAXB sau XStream. În caz contrar, ar trebui să aveți o privire la biblioteci CSV, cum ar fi SuperCSV. Persoanele care pot viata cu fișiere java serializate pot utiliza mecanismul implicit persistență ca Guss a spus. persistență Direct Java poate fi cel mai rapid mod.

Publicat 12/03/2009 la 15:09
sursa de către utilizator

voturi
0

Puteți utiliza JOAFIP http://joafip.sourceforge.net/ Acesta te face capabil de a pune toate modelul de date în fișier și puteți accesa la el, actualizați - l, fără a reîncărca toate în memorie.

Publicat 03/04/2009 la 21:59
sursa de către utilizator

voturi
0

Dacă aveți un cuplu de KB, eu nu înțeleg de ce ai nevoie pentru a „comprima dimensiunea acestei structuri pe disc cât mai mult posibil“ Având în vedere că 181 MB de costuri spatiu pe disc 1 cent, aș sugera că ceva mai puțin decât acest nu este în valoare de cheltuieli prea mult timp gandindu-va.

Cu toate acestea pentru a răspunde la întrebarea dumneavoastră, puteți comprima fișierul așa cum îl scrieți. Precum și ObjectOutputStream, puteți utiliza XMLExcoder serializa harta. Acest lucru va fi mai compact decât folosind ObjectOutputStream și dacă vă decomprima fișierul pe care va fi capabil de a citi sau edita datele.

XMLEncoder xe = new XMLEncoder(
    new GZIPOutputStream(
        new FileOutputStream(filename+".xml.gz")));
xe.writeObject(map);
xe.close();
Publicat 04/04/2009 la 10:00
sursa de către utilizator

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more