Seite 1 von 1

Random Files schreiben

Verfasst: 06.06.2012 13:36
von alen
Hallo Community,

ich experementiere gerade ein wenig und stelle eine seltsame Erscheinung fest.

Der untere Code erzeugt Dateien mit Random Dateninhalt mit einer definierten Grösse (mb_block_size.l = 50).
Das entspricht 50 MB pro Datei.

Alle Dateien werden erzeugt aber nur ein Teil von Ihnen wird auch mit Daten befüllt.
Gedacht hatte ich mir, wenn ich in einer Schleife einen Speicherbereich reserviere ihn dann befülle und schreibe, dann anschliessend den Speicherbereich wieder freigebe, sollte das gehen.

Aber irgendwas klappt mit dem Reservieren und Freigeben des Speicherbereiches nicht. Anscheinend ended das rausschreiben der Daten nur bis zu dem Punkt, wieviel Speicher das System zur Verfügung hat. Oder das ist in meinem Fall einfach nur Zufall.

Vielleicht kann mir hier jemand einen Schubs geben, woran es liegen könnte.

Grüße
Alen

Code: Alles auswählen

EnableExplicit

Enumeration
  #random_file
EndEnumeration

Procedure CreateRandomDataBlockFile(count_of_files.l = 1, mb_block_size.l = 50)
  Protected.l size_of_block = (1024 * mb_block_size) * 1024
  Protected.s outfile, filename = "random", extension = "dat"
  
  Protected.l *MemoryID, files
  
  For files = 1 To count_of_files
    *MemoryID = AllocateMemory(size_of_block)
    
    If *MemoryID
      RandomData(*MemoryID, size_of_block)
      ;FillMemory(*MemoryID, size_of_block)
      
      outfile = GetPathPart(ProgramFilename()) + filename + Str(files) + "." + extension
      
      If CreateFile(#random_file, outfile )
        WriteData(#random_file, *MemoryID, size_of_block)
        CloseFile(#random_file)
      Else
        Debug "Konnte die Datei " + outfile + " nicht erstellen!"
      EndIf  
    EndIf
    
    FreeMemory(*MemoryID)
  Next
EndProcedure


CreateRandomDataBlockFile(10)

Re: Random Files schreiben

Verfasst: 06.06.2012 14:04
von STARGÅTE
Kann dein Problem nicht reproduzieren.

Ich erhalte genau 10 Datei zu je 52.428.800 Bytes welche auch mit Zufallsdaten gefüllt sind.

Re: Random Files schreiben

Verfasst: 06.06.2012 14:16
von ts-soft
Anmerkung: Wenn Du CurrentDirectory nicht bereits selbst im Code definiert hast, solltest Du stattdessen GetPathPart(ProgramFilename()) benutzen!

Niemals davon ausgehen, das CurrentDirectory zeigt immer auf die eigene Exe! Dies ist ein weit verbreiteter Irrglaube.

Gruß
Thomas

Re: Random Files schreiben

Verfasst: 06.06.2012 14:36
von alen
Hallo STARGÅTE

ich bekomme 9 Dateien mit entsprechender Füllung.
Die zehnte Datei ist eine Null Byte Datei.

Und wenn ich das ganze erweitere auf mehr Dateien, dann ist jede Datei < 10 gefüllt und jede Datei >9 eine Null Byte Datei. Und das ist mir halt nicht ganz klar.

Nutze PB 4.61 32 Bit unter WinXP 32Bit in einer VMWare Maschine.

Freien Speicher habe ich knappe 500 MB. Und 9 x 50MB Random Daten ergibt 450MB daher kam ich auf die Idee das der Speicher ggf. nicht freigegeben wird. Vielleicht mal so viele Dateien erzeugen wie Speicher in Deiner Maschine steckt. Ich versuche das mal auf der Host Maschine und berichte. Nur 8GB Speicher ist doch recht viel ;-)

Grüße
Alen
STARGÅTE hat geschrieben:Kann dein Problem nicht reproduzieren.

Ich erhalte genau 10 Datei zu je 52.428.800 Bytes welche auch mit Zufallsdaten gefüllt sind.

Re: Random Files schreiben

Verfasst: 06.06.2012 14:37
von alen
Hallo ts-soft,

danke für den Hinweis. Ich ändere es im Code.

Grüße
Alen

ts-soft hat geschrieben:Anmerkung: Wenn Du CurrentDirectory nicht bereits selbst im Code definiert hast, solltest Du stattdessen GetPathPart(ProgramFilename()) benutzen!

Niemals davon ausgehen, das CurrentDirectory zeigt immer auf die eigene Exe! Dies ist ein weit verbreiteter Irrglaube.

Gruß
Thomas

Re: Random Files schreiben

Verfasst: 06.06.2012 14:56
von STARGÅTE
Wenn es ein Speicherplatz problem gäbe, dann würde doch schon die Bedingung: If *MemoryID
fehlschlagen und damit garkeine 10. Datei erstellt werden.

Der Speicher wird auch ordnungsgemäß freigegeben, mein RAM springt hier halt immer von 900MB auf 950MB und wieder zurück.

Bist du dir sicher, dass du deine 10. Datei nicht mit einem Editor geöffnet hast?, denn dann hättest du ja keine Schreibrechte, und dann würde auch dein Speicher nicht freigegeben werden.

Du solltest also FreeMemory(*MemoryID) immer ausführen, und nicht nur dann, wenn die Datei erstellt wurde.

Re: Random Files schreiben

Verfasst: 06.06.2012 15:14
von alen
Hallo STARGÅTE,
STARGÅTE hat geschrieben:Bist du dir sicher, dass du deine 10. Datei nicht mit einem Editor geöffnet hast?, denn dann hättest du ja keine Schreibrechte, und dann würde auch dein Speicher nicht freigegeben werden.
Es läuft definitiv nichts anderes ausser die PB IDE mit Compiler. Man kann den Dateien über den Explorer bei der Entstehung zuschauen.
STARGÅTE hat geschrieben:Du solltest also FreeMemory(*MemoryID) immer ausführen, und nicht nur dann, wenn die Datei erstellt wurde.
Das probiere ich nochmal es immer laufen zu lassen.

Grüße
Alen

Re: Random Files schreiben

Verfasst: 06.06.2012 15:18
von alen
STARGÅTE hat geschrieben:Du solltest also FreeMemory(*MemoryID) immer ausführen, und nicht nur dann, wenn die Datei erstellt wurde.
Das hat es auch nicht gebracht. Die letzte Datei wird immer mit Null Bytes geschrieben. Versuche es gleich auf dem Host statt in der VM.

Grüße
Alen

Re: Random Files schreiben

Verfasst: 06.06.2012 15:36
von alen
Hallo Zusammen,

ich habe auf dem Host Rechner auf der VM weiter getestet.
Code wie oben im ersten Post.

Hostrechner = i7 mit 8GB (Windows 7 64Bit) mit dem kompilierten 32 Bit PB Programm
Virtueller Rechner = Windows XP SP3 (32Bit) 1GB Speicher mit dem kompilierten 32 Bit PB Programm

Bei 15 Dateien:
- VMWare -> letzte Datei Null Bytes
- Hostrechner -> alle Dateien mit 50MB befüllt

bei 200 Dateien:
- VMWare -> alle Dateien mit 50MB befüllt
- Hostrechner -> alle Dateien mit 50MB befüllt

Ich stelle fest, mit Speicher hat das also nichts zu tun. Muss anderswo hängen.
Werde das weiter beobachten. Ist auf jedenfall seltsam.

Grüße
Alen

Re: Random Files schreiben

Verfasst: 06.06.2012 17:19
von Kiffi
alen hat geschrieben:Muss anderswo hängen.
vielleicht ein Hintergrundprozess, der diese Datei blockieren könnte (Virenscanner, o.ä.)?


WriteData() hat ja auch einen Rückgabewert, den man auswerten kann:

Code: Alles auswählen

If Not WriteData(...
  Debug "Shit happens!"
(könnte man zum Bau einer kleinen Schleife verwenden)


Oder aber mal ein wenig mit FlushFileBuffers() experimentieren?

Grüße ... Kiffi