Ik heb een honderdtal files van type1, een honderdtal files van type2. Elke file bevat nog eens tienduizenden lijnen met datapunten. Elk datapunt is voorzien van een ID, waarop een join dient uitgevoerd te worden om tot een enorme dataframe te komen. Ik kan daarbij enkel de library's shutil, os, re, pandas en numpy gebruiken. Ik loop onherroepelijk vast omdat ik er niet in slaag de massa data te verwerken op de manier waarop ik dit (zie onder) implementeerde. Heb al proberen inlezen om dit te parallelliseren, maar kan geen additionele libs gebruiken. Ook chunks geprobeerd, maar dat krijg ik gewoon niet goed geïmplementeerd (weet ook niet of dat de oplossing is). Het lijkt me duidelijk dat ik hier gewoon een zeer geheugenintensief ding geïmplementeerd heb, maar het is me allerminst duidelijk hoe ik dit efficiënter krijg. Zo een krak ben ik nu ook nog niet in Python. Mocht iemand me kunnen helpen, of op weg kunnen zetten -> much appreciated. Ik zit even met de handen in het haar...
Apple M1 Max, met 64Gb RAM.
Opbouw files: Filenaam bevat ID en type van data. Dat kan ik er probleemloos uithalen. Soms zitten er meer datapunten voor een ID in file type1, soms dan weer in type2. Uiteindelijk zou de resulterende frame als volgt moeten opgebouwd zijn (daar loopt het mis):
Een dataframe type1 kan van volgende vorm zijn:
ID type1
1 [1,2,3]
1 [2,3]
2 [4,5]
Een dataframe type2 kan van volgende vorm zijn:
ID type2
1 [3]
3 [2,3]
4 [4,5]
Dit zou dan een dataframe df moeten opleveren dat er uitziet als:
ID type1 type2
1 [1,2,3] [3]
1 [2,3] NaN
2 [4,5] NaN
3 NaN [2,3]
4 NaN [4,5]
...
Python 3.9 (Jupyter notebook)
Enkel volgende library's te gebruiken: shutil, os, re, pandas en numpy
...
...
Apple M1 Max, met 64Gb RAM.
Opbouw files: Filenaam bevat ID en type van data. Dat kan ik er probleemloos uithalen. Soms zitten er meer datapunten voor een ID in file type1, soms dan weer in type2. Uiteindelijk zou de resulterende frame als volgt moeten opgebouwd zijn (daar loopt het mis):
Een dataframe type1 kan van volgende vorm zijn:
ID type1
1 [1,2,3]
1 [2,3]
2 [4,5]
Een dataframe type2 kan van volgende vorm zijn:
ID type2
1 [3]
3 [2,3]
4 [4,5]
Dit zou dan een dataframe df moeten opleveren dat er uitziet als:
ID type1 type2
1 [1,2,3] [3]
1 [2,3] NaN
2 [4,5] NaN
3 NaN [2,3]
4 NaN [4,5]
...
Python 3.9 (Jupyter notebook)
Enkel volgende library's te gebruiken: shutil, os, re, pandas en numpy
...
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
| #Haal ID uit filename (werkt) def getID(filename): file_split = filename.split('-') if (file_split[0]).isdigit(): return int(file_split[0]) #Haal type uit filename (werkt) def getType(filename): file_split = filename.split('-') return file_split[2] #Haal waarden uit een bestand. Elke lijn gaat gewoon in een lijst met de respectievelijke waarden. Lengte varieert per filetype. Dit levert dan een dataframe met in de eerste kolom de IDs en in de tweede kolom de lijsten met waarden (werkt) def getMetrics(filename): contents = [] ids = [] with open(path + filename, 'r') as f: for line in f: temp = [] # all files all space seperated but one which is , seperated linecopy = line.replace(',', ' ') lineContent = linecopy.split(' ') length = len(lineContent) ids.append(getID(filename)) for i in range(0,length): #rstrip to remove the annoying \n so we can convert to float right away temp.append(float(lineContent[i].rstrip())) contents.append(temp) f.close() dictionary = {'Id':ids,'Metrics':contents} df=pd.DataFrame(dictionary) return df #Locatie naar folder met bestanden path = 'path/' #Bouw nu dataframe op adv bovenstaande functies -> crasht #De afzonderlijke dataframes (type1 en type2 krijg ik er nog uitgeperst, de merge echter niet) def createDF(pathname): type1 = pd.DataFrame(columns=['Id', 'List1']) type2 = pd.DataFrame(columns=['Id', 'List2']) for filename in os.listdir(pathname): temp = getMetrics(filename) if getType(filename) == 'type1.out': type1 = pd.concat([type1, temp], ignore_index=True) elif getType(filename) == 'type2.out': type2 = pd.concat([type2, temp], ignore_index=True) return pd.merge(type1, type2, on='Id', how='outer') |
...