Beschleunigen mit Multiprocessing

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
Speedy
User
Beiträge: 11
Registriert: Mittwoch 4. September 2019, 11:29

Hallo zsm,

wie bereits in meinen vorherigen Posts geschrieben, arbeite ich mit großen Ecxel Dateien...

Da ich die Excel Dateien (xls) mit den ganzen Sheets nicht einfach in csv umwandeln kann, da sonst die Informationen verloren gehen, muss ich wohl weiterhin pd.ExcelFile nutzen. Und da diese Funktion bei vielen Dateien unglaublich lange dauert, aber es keine andere Alternative gibt, habe ich mich am Multiprocessing versucht. Erfolglos. Es dauert sehr viel länger als ohne. Allein schon dieses einfache Beispiel:

Code: Alles auswählen

from multiprocessing import Pool

def f(x):
    return x*x

if __name__ == '__main__':
    p = Pool(4)
    print(p.map(f, [1, 2, 3]))
Es hat so lange gedauert, dass ich nicht mehr die Geduld dafür aufbringen konnte und habe abgebrochen.

Allerdings verstehe ich das nicht so ganz. Müsste es nicht sogar schneller schneller als ohne Multiprocessing sein? Warum aber kommt in diesem Fall das Programm noch nicht mal zum Ende?
Benutzeravatar
__blackjack__
User
Beiträge: 13110
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Speedy: Machst Du das eventuell unter Windows und in einer IDE die doof ist? Ob die doof ist, kann man testen in dem man das ohne IDE ausführt — wenn es dann problemlos durchläuft, ist die IDE doof. 😉
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

Bevor Du mit Beschleunigung anfängst, solltest Du erst einmal sauberen Code schreiben. Das war in Deinem anderen Thread noch nicht der Fall, und meist löst sich das Problem von selbst, wenn man strukturiert schreibt; es ist aber unabdingbar, wenn man Multiprocessing einsetzen will.
Einfache Beispiele bringen bei Multiprocessing nichts, weil das Auf- und Abbauen der Prozesse ein vielfaches der Rechenzeit brauchen.

Um zu wissen, was an Deinenen Versuchen nicht klappt, mußt Du schon Deinen Code zeigen.

Dein einfaches Beispiel läuft bei mir.
Speedy
User
Beiträge: 11
Registriert: Mittwoch 4. September 2019, 11:29

@Speedy: Machst Du das eventuell unter Windows und in einer IDE die doof ist? Ob die doof ist, kann man testen in dem man das ohne IDE ausführt — wenn es dann problemlos durchläuft, ist die IDE doof.
Ja genau, Windows 10 und ich benutze Jupyter..Was benutzt ihr?
Bevor Du mit Beschleunigung anfängst, solltest Du erst einmal sauberen Code schreiben. Das war in Deinem anderen Thread noch nicht der Fall, und meist löst sich das Problem von selbst, wenn man strukturiert schreibt; es ist aber unabdingbar, wenn man Multiprocessing einsetzen will.
Einfache Beispiele bringen bei Multiprocessing nichts, weil das Auf- und Abbauen der Prozesse ein vielfaches der Rechenzeit brauchen.

Um zu wissen, was an Deinenen Versuchen nicht klappt, mußt Du schon Deinen Code zeigen.
Ja, ich arbeite gerade daran, eine Idee, an der ich noch arbeiten muss ist:

Code: Alles auswählen

def prep_data(b,c):
    file_conc = pd.DataFrame()
    for i in range(b, c+1):
        file = pd.ExcelFile(os.path.join(path_exc, barcode[i]))
        file_conc.append(file)
Und danach muss ich noch das mit den Sheets machen, aber davor will ich den ersten Teil beschleunigen.

Mein Plan ist es, ein DataFrame mit allen Sheets zu machen und sie später dann zerteilen, da die ersten 3 Sheets anders sind.
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

Jupyter kann man nicht mit multiprocessing benutzen.

barcode kommt aus dem Nichts. Das funktioniert mit multiprocessing auch nicht. i, b und c sind schlechte Variablennamen.
Speedy
User
Beiträge: 11
Registriert: Mittwoch 4. September 2019, 11:29

Jupyter kann man nicht mit multiprocessing benutzen.
Das wusste ich nicht :O Dabei hatte ich alle nötigen Packages installiert. Hast du Empfehlungen?

Code: Alles auswählen

barcode kommt aus dem Nichts. Das funktioniert mit multiprocessing auch nicht. i, b und c sind schlechte Variablennamen.
Habe mein Programm in mehrere Zellen aufgeteilt, damit es nicht so lange dauert, wenn man nur an einer Stelle etwas ändern möchte. barcodes hatte ich vorher definiert, das ist der Ordner, in dem die ganzen Files mit den xls Dateien sind.

Ja daran muss ich auch noch pfeilen... aber gerade ist meine Priorität die Rechenzeit. Die lange Wartezeit macht mich krank.
Benutzeravatar
__blackjack__
User
Beiträge: 13110
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Also `i` ist IMHO der einzige Name der hier geht, alle anderen sind schlecht. `path_exc` kommt auch aus dem nichts.

Was ist denn `barcode`? Warum ist das keine Liste? Und falls es doch eine Liste ist, warum dann `i` und `range()` und nicht einfach „slicing“-Syntax?

`file_conc` macht keinen Sinn. 1. weil man an einen `DataFrame` keine beliebigen Objekte anhängen kann, 2. weil wenn es denn ginge `append()` das Objekt nicht verändert, sondern ein neues liefert, und 3. wäre ein `DataFrame` für `ExcelFile`-Objekte nicht der passende Container.

Ich denke nicht das Jupyter-Notebooks wirklich gut geeignet sind um Programme zu entwickeln.

`barcodes` sind *Ordner*? Ich hatte bei dem Namen ja, äh, Barcodes erwartet. Und auch wenn das so in einer anderen Zelle definiert ist, kann/sollte man das trotzdem sauber als Argument an die Funktion übergeben.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten