Seite 1 von 1
Beschleunigen mit Multiprocessing
Verfasst: Sonntag 10. November 2019, 20:44
von Speedy
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?
Re: Beschleunigen mit Multiprocessing
Verfasst: Sonntag 10. November 2019, 21:03
von __blackjack__
@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.

Re: Beschleunigen mit Multiprocessing
Verfasst: Sonntag 10. November 2019, 21:06
von Sirius3
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.
Re: Beschleunigen mit Multiprocessing
Verfasst: Sonntag 10. November 2019, 21:14
von Speedy
@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.
Re: Beschleunigen mit Multiprocessing
Verfasst: Sonntag 10. November 2019, 21:25
von Sirius3
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.
Re: Beschleunigen mit Multiprocessing
Verfasst: Sonntag 10. November 2019, 21:36
von Speedy
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.
Re: Beschleunigen mit Multiprocessing
Verfasst: Sonntag 10. November 2019, 21:49
von __blackjack__
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.