ProjekthintergrundWährend der Verarbeitung muss Feld A heute Morgen aktualisiert werden. Am Nachmittag schließt das Crawler-Team das Crawlen der Spezifikationen oder Bilder ab und muss die Bilder und Spezifikationsfelder aktualisieren. Aufgrund des tiefen Umblätterns von zig Millionen Seiten in einer einzigen Tabelle wird die Verarbeitungsgeschwindigkeit immer langsamer. wähle a,b,c aus db.tb Limit 10000 Offset 9000000 Aber die Zeit ist begrenzt. Gibt es eine bessere Möglichkeit, dieses Problem zu lösen? Verbesserungsideen Gibt es eine Möglichkeit, Daten zu aktualisieren, ohne tief in die Seiten zu blättern? Dateneigenschaften beobachtenDiese einzelne Tabelle verfügt über eine automatisch inkrementierende ID-Spalte und ist der Primärschlüssel. Die ideale Methode zum Abfragen und Aktualisieren von Daten basiert auf der Indexspalte. Wählen Sie a, b, c aus db.tb, wobei id=9999999; Aktualisiere db.tb, setze a=x, wobei id=9999999; Mehrfachverarbeitung Jeder Prozess verarbeitet Daten innerhalb eines bestimmten ID-Bereichs, wodurch Deep Page Flipping vermieden wird und mehrere Prozesse gleichzeitig Daten verarbeiten können. def Missionshandler (alle Missionen, Arbeiter-Missionsgröße): """ Die Aufgabenliste wird basierend auf der Gesamtzahl der Aufgaben und der Anzahl der Aufgaben jedes Mitarbeiters berechnet. Die Elemente der Aufgabenliste sind (Aufgabenstart-ID, Aufgabenende-ID). Beispiel: Die Gesamtzahl der Aufgaben beträgt 100 und die Anzahl der Aufgaben für jeden Mitarbeiter beträgt 40. Dann lautet die Aufgabenliste: [(1, 40), (41, 80), (81, 100)] :param all_missions: Gesamtzahl der Missionen :param worker_mission_size: maximale Anzahl der Missionen für jeden Arbeiter :return: [(start_id, end_id), (start_id, end_id), ...] """ Arbeiter_Missions-IDs = [] aktuelle_id = 0 während aktuelle_id <= alle_missionen: start_id = all_missions wenn current_id + 1 >= all_missions sonst current_id + 1 end_id = alle_Missionen wenn aktuelle_ID + Arbeiter-Missionsgröße >= alle_Missionen sonst aktuelle_ID + Arbeiter-Missionsgröße wenn start_id == end_id: wenn worker_mission_ids[-1][1] == start_id: brechen worker_mission_ids.anhängen((start_id, end_id)) aktuelle_ID += Arbeiter-Missionsgröße Arbeiter-Missions-IDs zurückgeben Angenommen, der Maximalwert einer einzelnen Tabellen-ID beträgt 100 und wir möchten, dass jeder Prozess 20 IDs verarbeitet. Dann sieht die Aufgabenliste wie folgt aus: >>> Missionshandler (100, 40) [(1, 40), (41, 80), (81, 100)] Also, von concurrent.futures importiere ProcessPoolExecutor def main(): # Maximalwert der Auto-Increment-ID max_id = 30000000 # Von einem einzelnen Worker verarbeitetes Datenvolumen worker_mission_size = 1000000 # Verwenden Sie mehrere Prozesse, um Missionen zu verarbeiten = Missionshandler (max_id, Worker_Missionsgröße). Arbeiter = [] Executor = ProcessPoolExecutor() für idx, Mission in enumerate(Missionen): Start-ID, End-ID = Mission Arbeiter.Anhängen(Executor.Senden(Datenhandler, Start-ID, End-ID, IDX)) auf def data_handler(start_id, end_id, worker_id): passieren Zusammenfassung der Ideen
Kenntnisse in der DatenverarbeitungAufzeichnung der Daten-IDs erfolgreicher und fehlgeschlagener Verarbeitungen für spätere Folgeverarbeitungen # Verwenden Sie eine andere Tabelle, um den Verarbeitungsstatus aufzuzeichnen. Einfügen in db.tb_handle_status (row_id, success) Werte (999, 0); Die Ausnahmeerfassung erfolgt innerhalb der Schleife, um ein abnormales Beenden des Programms zu verhindern. auf def data_handler(start_id, end_id, worker_id): #Datenverbindung conn, cursor = mysql() aktuelle_id = start_id versuchen: während aktuelle_id <= end_id: versuchen: # TODO Datenverarbeitungscode-Pass außer Ausnahme als e: # TODO-Datensatzverarbeitungsergebnisse# Daten werden zur nächsten current_id += 1 verschoben. weitermachen anders: # Keine Ausnahme, fahren Sie mit der Verarbeitung der nächsten Daten fort current_id += 1 außer Ausnahme als e: gibt 'worker_id({})' zurück: result({})'.format(worker_id, False) Endlich: # Datenbankressourcenfreigabe cursor.close() conn.close() gibt 'worker_id({})' zurück: result({})'.format(worker_id, True) Aktualisieren Sie Datenbankdaten so oft wie möglich per Batchübermittlung sql = """Aktualisiere db.tb, setze a=%s, b=%s, wobei id=%s""" Werte = [ ('a_Wert', 'b_Wert', 9999), ('a_Wert', 'b_Wert', 9998), ... ] # Batch-Übermittlung zur Reduzierung der Netzwerk-E/A und der Häufigkeit des Sperrenerwerbs cursor.executemany(sql, values) Oben ist der detaillierte Inhalt der Idee, zig Millionen Daten in einer einzigen MySQL-Tabelle zu verarbeiten. Weitere Informationen zur Verarbeitung zig Millionen Daten in einer einzigen MySQL-Tabelle finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM! Das könnte Sie auch interessieren:
|
<<: Analyse und Lösungen für Probleme bei der Verwendung von Label-Tags
>>: So öffnen Sie eine Seite in einem Iframe
Zunächst können Sie Moments öffnen und mehrere La...
Einführung Als ich mehr über die Datenbanktheorie...
Inhaltsverzeichnis 1. Grundkonzepte von GTID 2. G...
Dieser Artikel beschreibt die MySQL-Einzeltabelle...
Im Tabellenkopf können Sie die Farbe der hellen U...
Wie wird die Zeilenhöhe vererbt?Schreiben Sie ein...
Deshalb führen wir ein Einbettungsframework ein, u...
1. Verwenden Sie den Curl-Befehl für den Standard...
CPU-Last und CPU-Auslastung Beides kann bis zu ei...
In meinem letzten Beitrag habe ich darüber gesproc...
(1) Reduzieren Sie HTTP-Anfragen. (Ressourcendate...
Über Semantik Die Semantik ist die Lehre von der ...
1. Finden Sie heraus, ob MySQL zuvor installiert ...
Wenn der Docker-Container beendet wird, bleibt da...
1. Neuen Benutzer hinzufügen Nur lokalen IP-Zugri...