Interessanterweise habe ich zu dem Thema irgendwie nicht wirklich was ergooglen können...
Folgendes Problem:
Für einen Deduplizierungsalgorithmus möchte ich für Tests eine möglichst große (so ein paar Dutzend MB sollten schon drinnen sein) Datei zur Laufzeit erzeugen, die mit (pseudo-)zufälligen Daten gefüllt ist. Da ich danach auch Hashes testen möchte, sollten dann aber bei mehreren Durchläufen jeweils die gleichen Daten erzeugt werden.
Bisher erzeuge ich mit fixiertem Seed + dem "random" Befehl eher schlecht als recht einige ASCII chars - was mir einerseits nicht zufällig genug ist, andererseits dauert das Ganze auch noch ~30 Sekunden für 10 MB!
Ein bisschen Code dazu (zur Verwendung mit py.test, daher nicht reines Python):
Wie kann ich nun also (ohne eine __ MB große statische Datei aus /dev/random ins Repository zu laden) rein in Python in ~1 Sekunde eine große Datei erzeugen, die so zufällig wie möglich ist (Benchmark: gezippt immer noch >85% so groß wie ungezippt)?
An Betriebssystemen verwende ich sowohl Windows als auch Linux, und es soll auch auf beiden Plattformen testbar sein, also bitte nichts Plattformspezifisches.
Folgendes Problem:
Für einen Deduplizierungsalgorithmus möchte ich für Tests eine möglichst große (so ein paar Dutzend MB sollten schon drinnen sein) Datei zur Laufzeit erzeugen, die mit (pseudo-)zufälligen Daten gefüllt ist. Da ich danach auch Hashes testen möchte, sollten dann aber bei mehreren Durchläufen jeweils die gleichen Daten erzeugt werden.
Bisher erzeuge ich mit fixiertem Seed + dem "random" Befehl eher schlecht als recht einige ASCII chars - was mir einerseits nicht zufällig genug ist, andererseits dauert das Ganze auch noch ~30 Sekunden für 10 MB!
Ein bisschen Code dazu (zur Verwendung mit py.test, daher nicht reines Python):
Code:
import random
[...]
tempfile = tmpdir.join("hugefile.txt")
random.seed(0)
randomdata = bytearray()
for x in range(0,10000000): #<-- WTF 30 seconds!?
randomdata.append(random.randint(128,255))
with tempfile.open(mode="wb") as bigfile:
bigfile.write(randomdata)
#make sure the file has been created properly + the hash value is ok
assert tempfile.read() == randomdata
assert tempfile.computehash() == "cd23618e51385346e9cd2923f0ff8d22"
Wie kann ich nun also (ohne eine __ MB große statische Datei aus /dev/random ins Repository zu laden) rein in Python in ~1 Sekunde eine große Datei erzeugen, die so zufällig wie möglich ist (Benchmark: gezippt immer noch >85% so groß wie ungezippt)?
An Betriebssystemen verwende ich sowohl Windows als auch Linux, und es soll auch auf beiden Plattformen testbar sein, also bitte nichts Plattformspezifisches.