|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
sqlite jdbc
Sto usando il driver SQLiteJDBC (https://lists.hcoop.net/listinfo/sqlitejdbc) ma e' estremamente lento!!
Qualcuno conosce qualcosa di meglio?
__________________
In God we trust; all others bring data |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2774
|
Non ho ancora avuto modo di usarlo ma per un mio progetto pensavo di provare questo:
https://bitbucket.org/xerial/sqlite-jdbc |
![]() |
![]() |
![]() |
#3 | |
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
__________________
In God we trust; all others bring data |
|
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Ho provato, ma devo dire che le prestazioni sono deludenti anche in questo caso.
Quantomeno e' meglio del primo driver che ho provato: addirittura il primo driver falliva nell'inserimento di record nonostante i dati fossero corretti (un ciclo che inseriva migliaia di record, ma ogni tanto non ce la faceva). Mi sono messo a contare quanti record venivano inseriti e quanti persi, ed erano piu' quelli persi che inseriti. Ho provato ad inserire record con centinaia di campi, che poi e' il caso che mi interessa. Cmq le prestazioni sono davvero terribili, soprattutto confrontate a quelle che si ottengono con altri linguaggi. Se non ci sono altri driver jdbc per sqlite, forse e' il caso di riferirsi ad un altro database (se le prestazioni contano, ovviamente)
__________________
In God we trust; all others bring data |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2774
|
Mi chiedo solo se le così scarse performance sono dovute al driver o a SQLite. Se qualcuno potesse fare una prova con python o con qualcos'altro...
|
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Il driver è un layer in più alla fine. Non so com'è implementato, ma non dovrebbe mangiarsi tutto questo tempo.
Provare con Python è banale, perché c'è il modulo già integrato, e l'interfaccia con SQLite è diretta (richiama le API della DLL, peraltro già inclusa nel pacchetto standard di Python). Ecco qui la documentazione. Uno script di prova si realizza in una manciata di minuti. Consiglio Python 2.7 per fare qualche esperimento. Setup, Avanti, Avanti, Fine, e da shell: python NomeDelloScriptDiProva.py
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2774
|
Ma se ho già installato l'ultima versione posso installare anche la 2.7 senza problemi?
@sottovento: puoi postare il codice di prova che hai usato? |
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2774
|
Ho scritto questo codice di test:
Codice:
import sqlite3 conn = sqlite3.connect('example.db') c = conn.cursor() # Create table c.execute('''create table two_hundred_one (id integer, str_1 text, str_2 text, str_3 text, str_4 text, str_5 text, str_6 text, str_7 text, str_8 text, str_9 text, str_10 text, str_11 text, str_12 text, str_13 text, str_14 text, str_15 text, str_16 text, str_17 text, str_18 text, str_19 text, str_20 text, str_21 text, str_22 text, str_23 text, str_24 text, str_25 text, str_26 text, str_27 text, str_28 text, str_29 text, str_30 text, str_31 text, str_32 text, str_33 text, str_34 text, str_35 text, str_36 text, str_37 text, str_38 text, str_39 text, str_40 text, str_41 text, str_42 text, str_43 text, str_44 text, str_45 text, str_46 text, str_47 text, str_48 text, str_49 text, str_50 text, str_51 text, str_52 text, str_53 text, str_54 text, str_55 text, str_56 text, str_57 text, str_58 text, str_59 text, str_60 text, str_61 text, str_62 text, str_63 text, str_64 text, str_65 text, str_66 text, str_67 text, str_68 text, str_69 text, str_70 text, str_71 text, str_72 text, str_73 text, str_74 text, str_75 text, str_76 text, str_77 text, str_78 text, str_79 text, str_80 text, str_81 text, str_82 text, str_83 text, str_84 text, str_85 text, str_86 text, str_87 text, str_88 text, str_89 text, str_90 text, str_91 text, str_92 text, str_93 text, str_94 text, str_95 text, str_96 text, str_97 text, str_98 text, str_99 text, str_100 text, int_1 integer, int_2 integer, int_3 integer, int_4 integer, int_5 integer, int_6 integer, int_7 integer, int_8 integer, int_9 integer, int_10 integer, int_11 integer, int_12 integer, int_13 integer, int_14 integer, int_15 integer, int_16 integer, int_17 integer, int_18 integer, int_19 integer, int_20 integer, int_21 integer, int_22 integer, int_23 integer, int_24 integer, int_25 integer, int_26 integer, int_27 integer, int_28 integer, int_29 integer, int_30 integer, int_31 integer, int_32 integer, int_33 integer, int_34 integer, int_35 integer, int_36 integer, int_37 integer, int_38 integer, int_39 integer, int_40 integer, int_41 integer, int_42 integer, int_43 integer, int_44 integer, int_45 integer, int_46 integer, int_47 integer, int_48 integer, int_49 integer, int_50 integer, int_51 integer, int_52 integer, int_53 integer, int_54 integer, int_55 integer, int_56 integer, int_57 integer, int_58 integer, int_59 integer, int_60 integer, int_61 integer, int_62 integer, int_63 integer, int_64 integer, int_65 integer, int_66 integer, int_67 integer, int_68 integer, int_69 integer, int_70 integer, int_71 integer, int_72 integer, int_73 integer, int_74 integer, int_75 integer, int_76 integer, int_77 integer, int_78 integer, int_79 integer, int_80 integer, int_81 integer, int_82 integer, int_83 integer, int_84 integer, int_85 integer, int_86 integer, int_87 integer, int_88 integer, int_89 integer, int_90 integer, int_91 integer, int_92 integer, int_93 integer, int_94 integer, int_95 integer, int_96 integer, int_97 integer, int_98 integer, int_99 integer, int_100 integer)''') t = ('Text_1', 'Text_2', 'Text_3', 'Text_4', 'Text_5', 'Text_6', 'Text_7', 'Text_8', 'Text_9', 'Text_10', 'Text_11', 'Text_12', 'Text_13', 'Text_14', 'Text_15', 'Text_16', 'Text_17', 'Text_18', 'Text_19', 'Text_20', 'Text_21', 'Text_22', 'Text_23', 'Text_24', 'Text_25', 'Text_26', 'Text_27', 'Text_28', 'Text_29', 'Text_30', 'Text_31', 'Text_32', 'Text_33', 'Text_34', 'Text_35', 'Text_36', 'Text_37', 'Text_38', 'Text_39', 'Text_40', 'Text_41', 'Text_42', 'Text_43', 'Text_44', 'Text_45', 'Text_46', 'Text_47', 'Text_48', 'Text_49', 'Text_50', 'Text_51', 'Text_52', 'Text_53', 'Text_54', 'Text_55', 'Text_56', 'Text_57', 'Text_58', 'Text_59', 'Text_60', 'Text_61', 'Text_62', 'Text_63', 'Text_64', 'Text_65', 'Text_66', 'Text_67', 'Text_68', 'Text_69', 'Text_70', 'Text_71', 'Text_72', 'Text_73', 'Text_74', 'Text_75', 'Text_76', 'Text_77', 'Text_78', 'Text_79', 'Text_80', 'Text_81', 'Text_82', 'Text_83', 'Text_84', 'Text_85', 'Text_86', 'Text_87', 'Text_88', 'Text_89', 'Text_90', 'Text_91', 'Text_92', 'Text_93', 'Text_94', 'Text_95', 'Text_96', 'Text_97', 'Text_98', 'Text_99', 'Text_100', 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100) for id in range(100000): c.execute('insert into two_hundred_one values (' + str(id+1) + ', ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', t) # Save (commit) the changes conn.commit() # We can also close the cursor if we are done with it c.close() |
![]() |
![]() |
![]() |
#9 | |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Da Python stesso tramite il modulo timeit. Guardate gli esempi.
Altrimenti ci sono programmi esterni, come ptime (se non ricordo male). Quote:
![]() P.S. Non usare range, ma xrange per Python <= 2.7.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|
![]() |
![]() |
![]() |
#10 | |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Quote:
![]() |
|
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Mi sono permesso di dare una sistemata al codice:
Codice:
import sqlite3 conn = sqlite3.connect('example.db') c = conn.cursor() NumStrings = 100 NumIntegers = 100 # Create table c.execute('create table two_hundred_one (id integer, %s)' % ', '.join(['str_%s text' % i for i in xrange(1, NumStrings + 1)] + ['int_%s integer' % i for i in xrange(1, NumIntegers + 1)])) t = tuple(['Text_%s' % i for i in xrange(1, NumStrings + 1)] + range(1, NumIntegers + 1)) for id in range(100000): c.execute('insert into two_hundred_one values (' + str(id + 1) + ', ?' * (NumStrings + NumIntegers) + ')', t) # Save (commit) the changes conn.commit() # We can also close the cursor if we are done with it c.close() Non l'ho testato, ma credo che dovrebbe andare.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
![]() |
![]() |
![]() |
#12 |
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2774
|
Bello, mi chiedevo giusto come si potesse fare una cosa del genere. Quello che hai fatto nel ciclo for lo sapevo fare ma non l'ho fatto per ridurre al minimo le operazioni aggiuntive a execute, però ora è molto più manutenibile.
|
![]() |
![]() |
![]() |
#13 |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Allora basta precalcolare la query, e anche quel problema viene risolto:
Codice:
import sqlite3 conn = sqlite3.connect('example.db') c = conn.cursor() NumStrings = 100 NumIntegers = 100 # Create table c.execute('create table two_hundred_one (id integer, %s)' % ', '.join(['str_%s text' % i for i in xrange(1, NumStrings + 1)] + ['int_%s integer' % i for i in xrange(1, NumIntegers + 1)])) t = tuple(['Text_%s' % i for i in xrange(1, NumStrings + 1)] + range(1, NumIntegers + 1)) Query = 'insert into two_hundred_one values (%s' + ', ?' * (NumStrings + NumIntegers) + ')' for id in xrange(1, 100001): c.execute(Query % id, t) # Save (commit) the changes conn.commit() # We can also close the cursor if we are done with it c.close() ![]()
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
![]() |
![]() |
![]() |
#14 |
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2774
|
Giusto! Grande! Appena ho tempo aggiungo la misurazione del tempo ma sul mio pc non so se sarà molto significativo senza fare un confronto con la versione java perché ho un hd ssd...
Comunque a naso ci mette circa 20 secondi. |
![]() |
![]() |
![]() |
#15 |
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Scusate, avevo dei lavori da fare fuori casa (fra l'altro, oggi qui il termometro segna -28).
Il codice non e' di facile pubblicazione poiche' si tratta di lettura dei record da un file e poi di insert nel database. Preparero' un programmino di prova, ma ovviamente sara' banale. Nei miei test, ho provato a commentare tutte le righe relative all'inserimento dei dati in sqlite per verificare quanto pesasse il resto dell'applicazione, ed il risultato e' che l'operazione e' terminata in un batter d'occhio. Nel caso rimetta le operazioni sul database, ci impiega decine di minuti per portarla a termine. Evidentemente l'overhead della mia applicazione non e' significativo. Anche su internet ci si lamenta delle prestazioni del driver jdbc. Per inciso: qualcuno ha misurato - anche spannometricamente - le prestazioni della versione pitonata? Ok, ora ceno. Dopo preparo i test.
__________________
In God we trust; all others bring data |
![]() |
![]() |
![]() |
#16 |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
A questo punto non sarebbe meglio utilizzare l'interfaccia nativa SQLite(anziché ODBC) tramite JNI?
http://docs.oracle.com/javase/7/docs...tro.html#wp725 http://en.wikipedia.org/wiki/Java_Native_Interface http://192.9.162.55/docs/books/jni/ http://www.ibm.com/developerworks/java/tutorials/j-jni/ |
![]() |
![]() |
![]() |
#17 | |
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
A questo punto e' piu' facile provare un altro database, pero'.
__________________
In God we trust; all others bring data |
|
![]() |
![]() |
![]() |
#18 |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
No, che reimplementare il driver. Devi solo mappare quelle poche funzioni che ti servono. Crei una dll/so proxy che ti mappa le 2/3(4/5) funzioncine dalla dll/so SQLite.
|
![]() |
![]() |
![]() |
#19 |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Nientedimeno se ne trovano di già bell'e pronti:
http://code.google.com/p/sqlite4java/ ![]() EDIT: Eh! va che roba: Codice:
SQLiteConnection db = new SQLiteConnection(new File("/tmp/database")); db.open(true); ... SQLiteStatement st = db.prepare("SELECT order_id FROM orders WHERE quantity >= ?"); try { st.bind(1, minimumQuantity); while (st.step()) { orders.add(st.columnLong(0)); } } finally { st.dispose(); } ... db.dispose(); Ultima modifica di Vincenzo1968 : 02-03-2013 alle 18:21. |
![]() |
![]() |
![]() |
#20 |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Eh! nientedimeno!
http://www.codicefacile.it/tutorials...ava+con+SQLite Il binding per Java Specifico subito che esistono molti bindings per Java, tutti disponibili dal sito ufficiale. In generale esistono i bindings native e quelli 100% Java. I primi sfruttano la dll originale di SQLite, e forniscono solo un'interfaccia a tale dll tramite una libreria jar. I bindigs 100% invece hanno prestazioni leggermente minori, ma hanno il vantaggio di essere totalmente multipiattaforma, proprio perchè 100% Java. Anche i metodi di comunicazione possono essere diversi. In questo tutorial vedremo come utilizzare un binding 100% Java a cui si può accedere con il classico JDBC, e quindi il package java.sql. |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 00:48.