2009-01-11 15 views
6

Hey stackoverflow Gemeinschaft!Zu wenig CPU-Auslastung in Java

Ich habe ein Problem, wo ein hoch involviertes algorithmisches Programm TOO LITTLE CPU-Auslastung verwendet: irgendwo zwischen 3 und 4%. Es dauert sehr lange, Ergebnisse zurückzugeben, und ich glaube, es funktioniert einfach nicht genug.

Haben irgendwelche Genies irgendwelche Ideen, warum das passieren würde - wenn überhaupt, würde ich 100% Auslastung erwarten. Ein zusätzliches Detail ist, dass das Programm Einfügungen in eine sqlite3-Datenbank vornimmt, und ja, es gibt viele JNI-Aufrufe über die sqlite3jdbc-Bibliothek, glaube ich. (Beachten Sie, dass ich diese Einfügungen mit einem PreparedQuery-Stapel früher verschieben wollte, aber das verursachte größere Speicherprobleme - es gibt viele Daten).

Vielen Dank im Voraus

UPDATE: Fest. Ja, ich war nur ein Dummkopf, aber ich hatte nicht erwartet, dass sqlite eine neue Transaktion starten würde und so viel Overhead machen würde.

Ich benutze jetzt eine PreparedStatement und Warteschlange 32768 Einträge vor dem Einfügen - schien mir eine gut genug Nummer.

Antwort

1

Offensichtlich verursachen die Datenbankaufrufe Verzögerungen. Ist es nicht eine Option, kleinere Chargen zu erstellen und zu testen, ob das hilft? Vielleicht könnten Sie den Algorithmus auch parallelisieren, um irgendwo eine Warteschlange zu haben, die Ergebnisse aufnimmt, und einen anderen Thread, der diese Warteschlange bereinigt?

edit:

Es gibt auch einige andere Problembereiche:

  • Datenbank Optimalisierung (Modell)
  • Database Server-Konfiguration
  • Plattengeschwindigkeit

Alle diese Faktoren sollten berücksichtigt werden

1

Wenn Sie eine Menge Daten schreiben, klingt es vielleicht so, als wären Sie an die Festplatte gebunden. Werfen Sie einen Blick auf Ihre Festplatte Statistiken auf der Maschine, und wenn das ist eigentlich der Flaschenhals, entweder finden Sie Hardware mit besseren io, oder herauszufinden, wie Sie weniger Schreibvorgänge.

4

Ich würde niemals empfehlen, dass jemand einen JDBC-Treiber mit JNI verwendet, wenn eine Typ IV, 100% Java-Version verfügbar ist. Google gefunden this eins.

Abgesehen davon kann ich nichts ohne weitere Informationen sagen. Laufen die App und die Datenbank auf derselben Hardware?

Was ist so intensiv an INSERTs?

Ich würde Profiling empfehlen und einige echte Daten erhalten, anstatt zu raten. Glaube-basiertes Computing funktioniert nie für mich.

0

Die Festplatte verlangsamt Ihre App. INSERTS verwenden die Festplatte, die Festplatte ist langsam und das Betriebssystem muss warten, bis die Schreiboperationen abgeschlossen sind.

Können Sie nicht 2 Threads verwenden, einen für den Algorithmus und einen anderen für die Inserts? Wenn Sie nur Einfügungen vornehmen, können Sie diese auch in eine Textdatei schreiben und zu einem späteren Zeitpunkt ausführen

+0

Die Multithread-Kommunikation ist langsamer als das Einreihen der Updates in die Warteschlange und das Löschen derselben im selben Thread und auch komplizierter, um Fehler zu vermeiden für Programmierer, die nicht "threadsicher" geboren sind. – Blaisorblade