Domanda

Ehi comunità di StackOverflow!

Sto riscontrando un problema in cui un programma algoritmico altamente coinvolto sta utilizzando un utilizzo della CPU TROPPO PICCOLO: tra il 3 e il 4%. Ci vuole molto tempo per restituire risultati e credo che non stia funzionando abbastanza bene.

Qualcuno di voi geni ha qualche idea del perché ciò accada - semmai mi aspetto un utilizzo al 100%. Un ulteriore dettaglio è che il programma effettua inserimenti in un database sqlite3 e quindi sì, ci sono molte chiamate JNI tramite la libreria sqlite3jdbc credo. (Nota che volevo rinviare questi inserti con un batch PreparedQuery in precedenza, ma questo ha causato gravi problemi di memoria - ci sono molti dati).

Grazie in anticipo

AGGIORNAMENTO: fisso. Sì, stavo solo facendo il doofus, ma non mi aspettavo che sqlite avrebbe avviato una nuova transazione e fatto così tanto tempo.

Ora uso un PreparedStatement e metto in coda 32768 voci prima dell'inserimento - mi è sembrato un numero abbastanza buono.

È stato utile?

Soluzione

Ovviamente le chiamate al database stanno causando ritardi. Non è un'opzione per creare lotti più piccoli e testare se questo aiuta? Forse potresti anche parallelizzare l'algoritmo per avere una coda da qualche parte che prende risultati e un altro thread che pulisce quella coda?

modifica:

Esistono anche altre aree problematiche:

  • Ottimizzazione del database (modello)
  • Configurazione del server di database
  • Velocità disco

Tutti questi fattori dovrebbero essere presi in considerazione

Altri suggerimenti

Non consiglierei mai a qualcuno di usare un driver JDBC con JNI se è disponibile una versione Java al 100% di tipo IV. Google ha trovato questo .

A parte questo, non posso dire nulla senza ulteriori informazioni. L'app e il database sono in esecuzione sullo stesso hardware?

Che cosa è così "intensivo" sugli INSERTI?

Consiglio di profilare e ottenere alcuni dati reali invece di indovinare. L'elaborazione basata sulla fede non funziona mai per me.

Se stai scrivendo molti dati, sembra che potresti essere legato al disco. Dai un'occhiata alle statistiche del tuo disco sul computer e, se questo è effettivamente il collo di bottiglia, trova l'hardware con io migliore o scopri come fare meno scritture.

Il disco sta rallentando l'app. Gli INSERTI utilizzano il disco, il disco è lento e il sistema operativo deve attendere il completamento delle operazioni di scrittura.

Non puoi usare 2 thread, uno per l'algoritmo e un altro per gli inserti? Se esegui solo inserimenti, puoi anche scrivere in un file di testo ed eseguirli in un secondo momento

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top