Eine Forschleife mit Threads abarbeiten um es zu schneller zu machen. Ist das möglich?

Damlo

Mitglied
Hallo zusammen,

ich bekomme von einer API Schnittstelle, die ich mit einem Index aufrufe, Werte.

Ich bekomme den Letzten Eintrag auch raus. Sagen wir mal, der wäre 420.555. (ist wirklich nur ein beispiel, könnten auch mehr Daten sein. Es werden auch täglich mehr Daten)

jetzt kann ich eine forschleife machen die in etwa so aussieht:
Java:
for(int i =0; i <= 420555;i++){
 url = new URl("https://irgendeineURL/"+ i);
 ...
}

diese läuft aber verflucht lange. ( Klar sind auch viele Einträge usw. die ich auslese aber mehrer Stunden möchte ich nicht immer warten. Muss sie öfters mal abgleichen)

habt ihr eine Idee, wie ich dies schneller machen könnte ?
Ich habe da irgendwie an Threads gedacht. Aber da ich noch nie mit Threads gearbeitet habe und im Internet auch nichts in dieser Richtung gefunden habe, habe ich noch keine Idee. Wie ich das umsetzten könnte. Und bevor ich mir jetzt die "mühe" mache, mich da einzuarbeiten und nichts für diese Aufgabe ist. Wollte ich mal fragen ob es so überhaupt gehen würde?

Mit freundlichen Grüßen Damlo :)
 

mrBrown

Super-Moderator
Mitarbeiter
Ja, das lässt sich ziemlich gut mit Threads parallelisieren ;)

Als Stichwort vllt ExecutorService


BTW, da du von mehrere Tagen sprichst, lassen sich die bisherige Ergebnisse nicht cachen?
 

JStein52

Top Contributor
Ja, das lässt sich ziemlich gut mit Threads parallelisieren
Du solltest aber schon mal testen was du hier durch parallelisierung gewinnst. Der "Algorithmus" lässt sich natürlich schon gut parallelisieren aber das Problem scheint mir ja nicht so sehr CPU-bound als mehr IO-bound zu sein und die Frage ist ob es an irgendwelchen darunterliegenden Schichten nicht doch wieder serialisiert wird.
 

mrBrown

Super-Moderator
Mitarbeiter
Du solltest aber schon mal testen was du hier durch parallelisierung gewinnst. Der "Algorithmus" lässt sich natürlich schon gut parallelisieren aber das Problem scheint mir ja nicht so sehr CPU-bound als mehr IO-bound zu sein und die Frage ist ob es an irgendwelchen darunterliegenden Schichten nicht doch wieder serialisiert wird.
Grad IO-Bound lässt sich doch gut parallelisieren wenns übers Netzwerk geht

Einmal so, einmal mit parallel
Java:
IntStream.range(0, max).mapToObj(i -> test()).collect(Collectors.joining());

Java:
private String test() {
    try {
        URL url = new URL("https://example.com/");
        BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream()));
        return reader.lines().collect(Collectors.joining());
    } catch (java.io.IOException e) {
        throw new UncheckedIOException(e);
    }
}

Ergebnis dürfte eindeutig sein:
Code:
Benchmark             Mode    Cnt           Score           Error  Units
MyBenchmark.parallel  avgt    9    352_107_740,398 ± 119462722,332  ns/op
MyBenchmark.serial    avgt    9  1_028_141_011,222 ±  77239561,461  ns/op
 

JStein52

Top Contributor
Im Prinzip ja, wenns dumm läuft warten aber 10 Threads bis ein Ergebnis nach dem anderen daher kommt. Deshalb mal verifizieren. Ich würde ja deinen Ansatz mit dem cachen favorisieren falls das machbar ist. Aber er schreibt ja davon dass er ab und zu mal abgleichen will, das klingt eher so als ob das eben nicht geht
 

mrBrown

Super-Moderator
Mitarbeiter
Im Prinzip ja, wenns dumm läuft warten aber 10 Threads bis ein Ergebnis nach dem anderen daher kommt. Deshalb mal verifizieren.
Naja, wäre dann trotzdem nicht langsamer, als wenn ein Thread 10 mal wartet.

Ich würde ja deinen Ansatz mit dem cachen favorisieren falls das machbar ist. Aber er schreibt ja davon dass er ab und zu mal abgleichen will, das klingt eher so als ob das eben nicht geht

Kommt drauf an, wie die API funktioniert. Im Idealfall lassen sich mehrere zusammen abfragen und der Server unterstützt Caching, aber da können wir nur raten ;)
 

JStein52

Top Contributor
Naja, wäre dann trotzdem nicht langsamer, als wenn ein Thread 10 mal wartet
Das stimmt. Aber die Frage war wird es schneller. Die Antwort ist meiner Meinung nach: Wahrscheinlich schon, wenn du Pech hast aber auch nicht. Wir wissen zu wenig über die Daten, wo sie herkommen, wie sie dort entstehen, was damit gemacht wird. Irgendwas muss er ja auch mit tun sonst ist es sinnlos die zu holen.
 

Damlo

Mitglied
Also die Daten speicher ein in meiner Datenbank. Habe am Wochenende mal den ExecutorService ausprobiert. Es scheint etwas schneller zu laufen. Aber ich denke eher das es daran liegt, die Daten auf die Datenbank zu speichern.

Ich habe in dem internen Forum mal nach gefragt, ob es eine Möglichkeit gibt weniger Anfragen zu stellen, aber bisher haben die es (noch) nicht vorgesehen sowas zu implementieren. Deswegen bleibt mir nichts anderes übrig als diese Abfragen los zu hauen. Ich habe trotzdem eine Zeit Gewinnung von ca 6 Stunden Erziehlt durch den ExecutorService.
 

mrBrown

Super-Moderator
Mitarbeiter
Aber ich denke eher das es daran liegt, die Daten auf die Datenbank zu speichern.

Schmeiß den Profiler an und find raus woran es liegt ;)
Und selbst wenn das Speichern das Problem sein sollte, kann man da vermutlich noch optimieren.

Ich habe in dem internen Forum mal nach gefragt, ob es eine Möglichkeit gibt weniger Anfragen zu stellen, aber bisher haben die es (noch) nicht vorgesehen sowas zu implementieren. Deswegen bleibt mir nichts anderes übrig als diese Abfragen los zu hauen.
Wenns ein einfacher http-Server ist gibts doch bestimmt last-modified oder eTag oder sonstiges? Oder ändern sich jeden Tag alle bisherigen und es kommen neue dazu?
 
X

Xyz1

Gast
Du greifst auf eine gemeinsame Quelle zu. Die Quelle wird wahrscheinlich schnell sein, das ist nicht das Problem. Die Übertragung wird langsam sein, bei mehreren parallelen Übertragungen wird eine Übertragung aber nicht langsamer werden, als wenn diese nacheinander geschehen. Das macht der Webbrowser auch. Also ein Pool mit fester Größe (10) wird eine Ersparnis einbringen. Mir fällt als Beispiel gerade nur ein RSS-Reader ein, der z. B. 100 Beiträge liest. Ich kann das später mal ausprobieren - wenn noch gewünscht.

Immer feststellen, was dort langsam ist - und ob man es umgehen kann.
 

Thallius

Top Contributor
Vieleicht erklärst du uns einfach mal was du da eigentlich für daten holst und was du damit vorhast. Ich denke dein ganzes Konzept hat einen großen Fehler....
 

Damlo

Mitglied
Also ich greife auf die API von https://www.themoviedb.org zu.

Ich möchte deren Filme auf eine Eigene Datenbank speichern. Heißt ich muss diese abfragen und bei mir speichern.
Ich nutze Java Spring boot um sie mir wieder anzeigen zu lassen. Hab da ein paar "erweiterte" sachen geschrieben, die https://www.themoviedb.org nicht bietet. Aber für die Informationen der Filme / Serien / Personen Whatever, muss ich sie bei mir in der Datenbank speichern.

Aber da man diese auch ändern kann auf dieser Seite. habe ich vorgesehen ein Vergleich zu schreiben, ob sich dort was geändert hat. Aber da es über 300.000 Einträge sind ( manche Id's gibt es nicht mehr, scheinen wohl gelöscht zu sein) dauert es halt.

Schmeiß den Profiler an und find raus woran es liegt ;)
Wie genau meinst du das? wie kann ich das testen ?

Ich bin zurzeit am überlegen, wie ich das Speichern Optimieren könnte. Zurzeit läuft es so, dass ich per For schleife über die ID's gehe. Die Url aufrufe, die JSON auslese, ein Objekt erzeuge, diese mit den JSON Inhalte fülle, aufbereite falls ich etwas anders haben möchte, speichere. Und das dann für alle ID's.
 

Thallius

Top Contributor
Das

"We currently rate limit requests to 40 requests every 10 seconds. You can inspect the status of your limits by looking at the X-RateLimit response headers."

hast du aber schon gelesen oder?

Gruß

Claus
 

Joose

Top Contributor
Ich bin zurzeit am überlegen, wie ich das Speichern Optimieren könnte. Zurzeit läuft es so, dass ich per For schleife über die ID's gehe. Die Url aufrufe, die JSON auslese, ein Objekt erzeuge, diese mit den JSON Inhalte fülle, aufbereite falls ich etwas anders haben möchte, speichere. Und das dann für alle ID's.

Meiner Meinung nach solltest du nur die Änderungen speichern was du eben zusätzlich bzw. anders anzeigen willst.
Die eigentlichen Daten würde ich immer von der Webseite lesen, damit ersparst du dir das Vergleichen und Abspeichern.
 

Damlo

Mitglied
ne, hatte ich noch nicht gelesen.
Wenn ich das dann rauf rechne. Bei ca 400.000 Einträgen brauche ich also ca 28 Stunden.
Um Sie einmalig alle zu laden... Dann brauche ich auch nichts "optimieren". Eher verschlechtern, da ich wahrscheinlich über meine 40 anfragen die 10 Sekunden komme
 

JStein52

Top Contributor
Ist bei dieser Schnittstelle das was heute die ID 4711 hat etwas anderes als das was morgen die ID 4711 hat ? Oder kommen neue ID's dazu und alte entfallen ?
 

JuKu

Top Contributor
Ich denke die IDs sind gleich.
Aber diese Art und Weise, wie du die Daten holst, ist nicht besonders gut...
Die Api wurde auch nie dazu designed, um deren ganze Datenbank auszulesen.

Außerdem solltest du unbedingt die Lizenz beachten:
https://www.themoviedb.org/documentation/api/terms-of-use
https://www.themoviedb.org/documentation/api/terms-of-use
z.B. steht da drin, dass du nicht unnötig viel Traffic erzeugen und bei allen Daten ein Verweis auf diese Seiten mit angeben musst.
Ich denke nach 4.2.4 ist dein Use Case gar nicht erlaubt.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
KonradN Mal eine Frage zu Binary Serialization Allgemeine Java-Themen 15
D Hat Java eine Library um JavaScript auszuwerten? Allgemeine Java-Themen 2
dokan wie kann ich eine funktionierende Suchleiste erstellen Allgemeine Java-Themen 1
B Wie erstelle ich dazu eine Abfrage ob der Button gedrückt wurde? Allgemeine Java-Themen 8
J Integration pay Pale in eine JavaFx Desktop Application Allgemeine Java-Themen 1
berserkerdq2 Wenn ich einfach eine GIF in den Scenebuilder als Bild reinpacke, wird das dann asl Gif angezeigt Allgemeine Java-Themen 1
8u3631984 Strukturiertes Logging : Jedes Feld in eine seperate Zeile - aber wie ? Allgemeine Java-Themen 2
berserkerdq2 Gibt es eine saubere Dokumentation von Jfoenix? Allgemeine Java-Themen 1
M Eigene Datenstruktur um eine Menge zu speichern Allgemeine Java-Themen 3
A Wie schreibe ich eine For-Schleife in ein Stream API um? Allgemeine Java-Themen 12
E Es ist nicht möglich, eine Batch-Anweisung auszuführen. Allgemeine Java-Themen 9
T Eine Frage des Designs Allgemeine Java-Themen 2
R Best Practice Erfahrungswerte für eine Migration von JSF nach Angular (oder anderes JS-Framework) Allgemeine Java-Themen 1
H Eine Linie verkürzen Allgemeine Java-Themen 5
N rekursion mehrfach eine Methode Öffnen Allgemeine Java-Themen 4
berserkerdq2 Wenn ich eine Methode nur jede 50ms ausführen will, wie mach ich das? Allgemeine Java-Themen 4
berserkerdq2 Wie synchronisiere ich eine for-Schleife Allgemeine Java-Themen 12
berserkerdq2 Wie mache ich in IJVM eine if verzweigung? Allgemeine Java-Themen 27
F Gibt es mittlerweile eine Alternative zu DaisyDiff Allgemeine Java-Themen 2
_user_q Was brauche ich, um eine eigene "Search for updates"-Funktion einzubauen? Allgemeine Java-Themen 1
E Eine Methode einer extendeten Klasse deakitivieren Allgemeine Java-Themen 12
LimDul Kam eine java.net.URL zu einer HashMap und ging als DNS Anfrage wieder heraus Allgemeine Java-Themen 18
pizza_dox_9999 Wie füge ich eine "eigene" ScriptEngine dem ScriptEngineManager? Allgemeine Java-Themen 3
F Kennt ihr eine Library um 2 HTML Seiten zu diffen? Allgemeine Java-Themen 8
Y ImagePanel von anderer Klasse in eine MainFrame Klasse hinzufügen. Allgemeine Java-Themen 1
OnDemand Anzeigen was eine Applikation macht Allgemeine Java-Themen 1
T Problem beim Umwandeln in eine Jar-Datei Allgemeine Java-Themen 3
J Eine Frage zu den Threads und Task Allgemeine Java-Themen 1
Tobero Wie bekomme ich in welchem Quadrat sich eine Position in einem Grid befindet Allgemeine Java-Themen 11
Tobero Wie kann man eine Poisson Disc Sampler? Allgemeine Java-Themen 7
M Openjdk - gibt es auch eine Openjre? Allgemeine Java-Themen 7
R Lambda Expression in einer Methode execute() aufrufen (execute() ist eine Methode aus dem funktionalen Interface Command) Allgemeine Java-Themen 5
S Noch eine Design-Frage zu Setter Allgemeine Java-Themen 6
N Arrayliste in eine Datei speichern Allgemeine Java-Themen 4
J Öffnen eine jar-Datei Allgemeine Java-Themen 11
Zrebna Gibt es eine Möglichkeit eine NPE zu vermeiden, wenn null returned wird? Allgemeine Java-Themen 3
S Klassen Einfügen von unbekannter menge an Variablen in eine Klasse mithilfe von ASM Allgemeine Java-Themen 5
R Wo müsste ich im Code eine Änderung vornehmen? Allgemeine Java-Themen 6
S Rückgabe einer HttpURLConnection für eine Seite einlesen bei der man eingeloggt ist..? Allgemeine Java-Themen 5
S Gibt es eine Moeglichkeit die Runtime Ausführung zu analysieren..? Allgemeine Java-Themen 7
S Habt ihr eine Idee wie man Serializierung testen kann..? Allgemeine Java-Themen 6
S Wenn eine Klasse zwei Interfaces mit derselben Methodensignatur implementiert: welche wird aufgerufen? Allgemeine Java-Themen 15
Drachenbauer warum bekomme ich hier eine NullPointerException Allgemeine Java-Themen 6
M Gibt es eine API die den aktuellen Wert eines Indikators beim Trading zurückgibt? Allgemeine Java-Themen 7
X Collections Gibt es eine Klasse welche die Vorteile von List und HashMap vereint, aber konstante Laufzeit (O(1)) hat in Java? Allgemeine Java-Themen 4
N Eine stelle der Fibonacci-Zahlenfolge ausgeben. Allgemeine Java-Themen 4
E Hat der Compiler einen Fehler oder warumbeendet return nicht eine Methode ? Allgemeine Java-Themen 7
W Collections Suche etwas Sorted-List-Artiges...hat jemand eine Idee? Allgemeine Java-Themen 13
L Methoden Über Reflections eine Methode mit aufrufen Allgemeine Java-Themen 3
S Kann ich eine Methode schreiben die alle Arten von funktionalen Interfaces akzeptiert..? Allgemeine Java-Themen 21
Drachenbauer Wie kann eine vorgegebene Farbe über einen String erkannt werden? Allgemeine Java-Themen 11
J Datenstruktur für eine Map erstellen Allgemeine Java-Themen 2
sascha-sphw Java 9 module Zugriff auf eine resource einer anderen JAR Allgemeine Java-Themen 0
pkm Kann eine ServerSocket-Klasse nicht stateful sein? Allgemeine Java-Themen 4
B Aufruf der Methode ergibt eine Exception Allgemeine Java-Themen 13
I Eine Anwendung so gut wie möglich beschützen Allgemeine Java-Themen 9
M Wie kann man eine void Methode mit Variablen von zwei verschiedenen Objekten ausführen? Allgemeine Java-Themen 15
X Wie mache ich hier eine Rekursion rein ? Allgemeine Java-Themen 7
K OOP Suche Hilfe + Erklärung für eine Hausaufgabe Allgemeine Java-Themen 1
N Über einen Button in JavaFX ein Event über eine Pipeline schicken(Netty) Allgemeine Java-Themen 1
M Login in eine Webseite mit Java Allgemeine Java-Themen 3
A NetBeans Suche Programmierer für eine Belegarbeit Allgemeine Java-Themen 11
D Warum kann ich eine (deflaut) Klasse aus einer Libary in einem anderen Projekt benutzen? Allgemeine Java-Themen 3
L Übergabe an eine eher einfache Java- Applikation wegen Kündigung Allgemeine Java-Themen 1
C Ein Iterator ist eine Implementierung des Interface Iterable? Allgemeine Java-Themen 2
M Schlüsselworte Was ist eine Java Spezifikation + JSR? Allgemeine Java-Themen 11
E RMI NULL-Pointer-Exeception wenn der RMI-Proxy eine Methode deligiert Allgemeine Java-Themen 2
E RMI FWH: RMI- Wie erstelle ich stubs dynamisch, bzw. unterdrücke eine Statisch-Warnung? Allgemeine Java-Themen 0
J Eine bestimmte Zahl im Integer ändern Allgemeine Java-Themen 9
Q-bert Strings aus der JList in eine Datenbank speichern Allgemeine Java-Themen 1
D Möglichkeit mit GAE eine Table auszulesen und eine csv zu schreiben Allgemeine Java-Themen 22
S Korrekte Pfadangaben damit eine .jar Datei unter Windwos läuft. Allgemeine Java-Themen 24
S Wie kann ich eine kleine Stelle in meinem Code mit multiplen Threads abarbeiten..? Allgemeine Java-Themen 20
B Gibt es eine Funktion die den Datentyp einer Variablen ermittelt? Allgemeine Java-Themen 8
R bei eclipse von java in eine andere programmiersprache wechseln? Allgemeine Java-Themen 2
D Pivot-Wahl beim QuickSort steigert die Effizienz, eine Lüge??? Allgemeine Java-Themen 17
C Eclipse einstellen, dass eine bestimmte JDK benutzt werden soll Allgemeine Java-Themen 3
M Klassen Eine Klasse in mehreren Klassen einbinden Allgemeine Java-Themen 11
A Best Practice Java - eine Art Plugin-Struktur Allgemeine Java-Themen 3
S wie rufe ich mit .jar datei eine .bat auf? Allgemeine Java-Themen 15
R Signatur von Methoden in eine Datei schreiben? Allgemeine Java-Themen 4
perlenfischer1984 Functionsparameter prüfen und eine Exception werfen !? Allgemeine Java-Themen 11
J Mehrere Wörter getrennt in eine Array einlesen, wie ? Allgemeine Java-Themen 7
E Methoden Hat jemand eine gute Lösung? Allgemeine Java-Themen 5
Z NullPointerException beim Schreiben einer ArrayList in eine Datei Allgemeine Java-Themen 6
Exdroid BlueJ Wie bekomme ich die Ausgabe in eine TXT Datei? Allgemeine Java-Themen 2
G Methoden Aus einem Event, wo ich weiß, dass es ausgeführt werden wird, eine Get-Methode basteln Allgemeine Java-Themen 8
F Wie kann ich auf einem System prüfen, ob eine lib verfügbar ist? Allgemeine Java-Themen 2
Tausendsassa Interface Eine Gui von einer anderen schließen lassen Allgemeine Java-Themen 3
S Threads Kann mir jemand helfen eine parallele Hilfsklasse zu implementieren..? Allgemeine Java-Themen 3
S Best Practice Brauche eine Idee für eine Java Projekt! Allgemeine Java-Themen 11
P Zwei ArrayLists: Ohne die eine überhaupt anzurühren, wird sie verändert Allgemeine Java-Themen 2
M Eine Datei im Speicher erneut laden(?) Allgemeine Java-Themen 1
V Gibt es eine Möglichkeit die Internet auslastung mit Java auszulesen Allgemeine Java-Themen 11
L Drop Emails von Outlook in eine JList Allgemeine Java-Themen 5
P Wie funktioniert das Feedback eines Klicks auf eine Java GUI Allgemeine Java-Themen 10
P Dezimalzahl in eine Binärzahl umrechnen Allgemeine Java-Themen 12
M Eine static-Methode verlassen Allgemeine Java-Themen 2
X HTTP Auslesen der Ergebnisse von einer Webseite und in eine Liste packen Allgemeine Java-Themen 1
T Input/Output Daten in eine Datei schreiben Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben