Seite 1 von 1

Verzwicktes List-Dictionary Gebilde für Filemerge +Statistik

Verfasst: Freitag 23. September 2011, 14:35
von HunrigerHans
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?

Re: Verzwicktes List-Dictionary Gebilde für Filemerge +Stati

Verfasst: Freitag 23. September 2011, 15:23
von snafu
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.

Re: Verzwicktes List-Dictionary Gebilde für Filemerge +Stati

Verfasst: Freitag 23. September 2011, 15:36
von frabron
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

Re: Verzwicktes List-Dictionary Gebilde für Filemerge +Stati

Verfasst: Freitag 23. September 2011, 16:08
von HunrigerHans
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?

Re: Verzwicktes List-Dictionary Gebilde für Filemerge +Stati

Verfasst: Freitag 23. September 2011, 21:44
von 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!?