Verzwicktes List-Dictionary Gebilde für Filemerge +Statistik

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
HunrigerHans
User
Beiträge: 7
Registriert: Dienstag 17. März 2009, 15:20

Hi :)

ich bin am Verzweifeln!!!
Ich habe Serverbenchmarks gemacht und ne Menge Files generiert:
6 Server * 4 URLs * 4 Concurrency Level * 5 Testdurchläufe = 480 Files

Diese Files genauergenommen die Testruns müssen nun gemerged werden.
Das File hat folgende Struktur:

Percentage served, Time in ms
0,2.345
1,3.45
2,5.33
...
99, 12.567

Jetzt würde ich gerne durch die Testläufe gehen und pro Testfall folgende Werte haben: Mean, Min, Max, Standardabweichung.

Also Struktur hatte ich mir bis jetzt folgendes gedacht:
testruns[ testcase1 : {Zeile1: [Wert aus Run 1, Wert aus Run 2, ..., Wert aus Run 5], Zeile2: [...]}, testcase2 : {}, ...]

Dann bräuchte man über die Listen nur noch ein bisschen Statistik zu jagen, was definitiv nicht das Problem ist.

Ich scheitere am Aufbau des Konstrukt :(

Bis hier hin komme ich:

print testruns
{'h104_c1000_n10000_u100kb': {0: [], 1: [], ..., 99: []}, 'h105_c750_n10000_u1b': {...} , ... }

Das Hinzufügen von Werten zu den Listen aus den einzelnen Files klappt nicht.

Hier der Code:

Code: Alles auswählen

import os

path = '/perc'
all = os.listdir(path)

testruns = {}
lines = {}

for i in range(0,100):
	lines[i] = []

for host in range (100, 106):
	for cc in [250, 500, 750, 1000]:
		for n in [10000]:
			for u in ['1b', '1kb', '10kb', '100kb']:
				testruns["h" + str(host) + "_c" + str(cc) + "_n" + str(n) + "_u" + u] = lines

for file in all:
	for key in testruns:
		if key in file:
			for linenumber in testruns[key]:
				pairlist=[]
				for line in open(path + '/' + file, 'r').readlines():
					pair = line.strip().split(",")
					pairlist.append(pair)
				for val in pairlist:
					if ((str(linenumber) == val[0]) & (key in file)):
						testruns[key][linenumber].append(val[1])

Die Werte der DictKeys in testruns sind in den Namen der Files wiederzufinden.
Testrun: h104_c1000_n10000_u100kb
Files: bench_h104_c1000_n10000_u100kb_r1_percentage_31-08_13:47:46.data
bench_h104_c1000_n10000_u100kb_r2_percentage_31-08_14:13:09.data
bench_h104_c1000_n10000_u100kb_r3_percentage_31-08_14:58:17.data
bench_h104_c1000_n10000_u100kb_r4_percentage_31-08_16:38:44.data
bench_h104_c1000_n10000_u100kb_r5_percentage_31-08_16:33:54.data

Hoffentlich ist das einigermaßen verständlich...
Ich bin verzweifelt... :(

Hat jemand eine Idee?
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Arbeit von innen nach außen und mach dir Funktionen für jeden einzelnen Schritt. Dann kriegst du da auch eine wartbare Struktur rein. Im Übrigen willst du dir vielleicht mal defaultdict anschauen.
frabron
User
Beiträge: 306
Registriert: Dienstag 31. März 2009, 14:36

In dem Fall ganz interessant: http://www.dabeaz.com/generators/index.html
Schau dir die Slides mal an, der Ansatz mittels verketteter Generatoren könnte auch was für dich sein
HunrigerHans
User
Beiträge: 7
Registriert: Dienstag 17. März 2009, 15:20

Danke für die schnelle Hilfe! Das defaultdict sieht ganz interessant aus, aber geht das nicht auch mit meinen Zeilen?

Was ist nicht verstehe:

Code: Alles auswählen

for file in all:
	filedict[file] = lines
	for line in open(path + '/' + file, 'r').readlines():
		if line.startswith("Percentage"): // erste Zeile auslassen
			pass
		else:
			pair = None
			pair = line.strip().split(",")
			linenumber = int(pair[0])
			linevalue = pair[1]
			print filedict[file][linenumber] // -> [] 
			filedict[file][linenumber].append(linevalue)
print filedict
das print filedict[file][linenumber] // -> [] gibt mir das leere Array zurück (wie erwartet)
Wenn ich die Zeile drauf dann zum Array hinzufügen will, dann explodiert die List und statt der von mir erwarteten 5 Werte pro filedict[file][linenumber] sind es etlich viele!?

Sehe ich den Wald vor lauter Bäumen nicht mehr?
BlackJack

@HunrigerHans: `lines` wird nie neu gebunden also fügst Du für jedes `file` die *selbe* Liste zu `filedict` hinzu. Das erscheint mir wenig sinnvoll. Vielleicht möchtest Du an der Stelle vielleicht lieber immer eine *neue* und *leere* Liste hinzufügen!?
Antworten