Random Files schreiben

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
alen
Beiträge: 107
Registriert: 09.04.2007 17:38
Computerausstattung: Main Hardware: AMD Ryzen 5 1600 - 6 Core / Gigabyte B450 Aorus Pro / Sapphire RX580 8GB
PB 5.61 and earlier @ Manjaro Linux XFCE x64/ Fedora Linux Cinnamon x64 / Windows 10 x64 on various Hardware Platforms
Wohnort: Duisburg
Kontaktdaten:

Random Files schreiben

Beitrag 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)
Zuletzt geändert von alen am 06.06.2012 15:16, insgesamt 2-mal geändert.
---
Main Hardware: AMD Ryzen 5 1600 - 6 Core / Asus B350M-A / Nvidia GTX650
PB 5.61 and earlier @ Manjaro Linux XFCE x64/ Fedora Linux Cinnamon x64 / Windows 10 x64
on various Hardware Platforms (Notebook and Desktop)
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Random Files schreiben

Beitrag 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.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Random Files schreiben

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
alen
Beiträge: 107
Registriert: 09.04.2007 17:38
Computerausstattung: Main Hardware: AMD Ryzen 5 1600 - 6 Core / Gigabyte B450 Aorus Pro / Sapphire RX580 8GB
PB 5.61 and earlier @ Manjaro Linux XFCE x64/ Fedora Linux Cinnamon x64 / Windows 10 x64 on various Hardware Platforms
Wohnort: Duisburg
Kontaktdaten:

Re: Random Files schreiben

Beitrag 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.
---
Main Hardware: AMD Ryzen 5 1600 - 6 Core / Asus B350M-A / Nvidia GTX650
PB 5.61 and earlier @ Manjaro Linux XFCE x64/ Fedora Linux Cinnamon x64 / Windows 10 x64
on various Hardware Platforms (Notebook and Desktop)
Benutzeravatar
alen
Beiträge: 107
Registriert: 09.04.2007 17:38
Computerausstattung: Main Hardware: AMD Ryzen 5 1600 - 6 Core / Gigabyte B450 Aorus Pro / Sapphire RX580 8GB
PB 5.61 and earlier @ Manjaro Linux XFCE x64/ Fedora Linux Cinnamon x64 / Windows 10 x64 on various Hardware Platforms
Wohnort: Duisburg
Kontaktdaten:

Re: Random Files schreiben

Beitrag 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
Zuletzt geändert von alen am 06.06.2012 15:25, insgesamt 1-mal geändert.
---
Main Hardware: AMD Ryzen 5 1600 - 6 Core / Asus B350M-A / Nvidia GTX650
PB 5.61 and earlier @ Manjaro Linux XFCE x64/ Fedora Linux Cinnamon x64 / Windows 10 x64
on various Hardware Platforms (Notebook and Desktop)
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Random Files schreiben

Beitrag 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.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
alen
Beiträge: 107
Registriert: 09.04.2007 17:38
Computerausstattung: Main Hardware: AMD Ryzen 5 1600 - 6 Core / Gigabyte B450 Aorus Pro / Sapphire RX580 8GB
PB 5.61 and earlier @ Manjaro Linux XFCE x64/ Fedora Linux Cinnamon x64 / Windows 10 x64 on various Hardware Platforms
Wohnort: Duisburg
Kontaktdaten:

Re: Random Files schreiben

Beitrag 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
---
Main Hardware: AMD Ryzen 5 1600 - 6 Core / Asus B350M-A / Nvidia GTX650
PB 5.61 and earlier @ Manjaro Linux XFCE x64/ Fedora Linux Cinnamon x64 / Windows 10 x64
on various Hardware Platforms (Notebook and Desktop)
Benutzeravatar
alen
Beiträge: 107
Registriert: 09.04.2007 17:38
Computerausstattung: Main Hardware: AMD Ryzen 5 1600 - 6 Core / Gigabyte B450 Aorus Pro / Sapphire RX580 8GB
PB 5.61 and earlier @ Manjaro Linux XFCE x64/ Fedora Linux Cinnamon x64 / Windows 10 x64 on various Hardware Platforms
Wohnort: Duisburg
Kontaktdaten:

Re: Random Files schreiben

Beitrag 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
---
Main Hardware: AMD Ryzen 5 1600 - 6 Core / Asus B350M-A / Nvidia GTX650
PB 5.61 and earlier @ Manjaro Linux XFCE x64/ Fedora Linux Cinnamon x64 / Windows 10 x64
on various Hardware Platforms (Notebook and Desktop)
Benutzeravatar
alen
Beiträge: 107
Registriert: 09.04.2007 17:38
Computerausstattung: Main Hardware: AMD Ryzen 5 1600 - 6 Core / Gigabyte B450 Aorus Pro / Sapphire RX580 8GB
PB 5.61 and earlier @ Manjaro Linux XFCE x64/ Fedora Linux Cinnamon x64 / Windows 10 x64 on various Hardware Platforms
Wohnort: Duisburg
Kontaktdaten:

Re: Random Files schreiben

Beitrag 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
---
Main Hardware: AMD Ryzen 5 1600 - 6 Core / Asus B350M-A / Nvidia GTX650
PB 5.61 and earlier @ Manjaro Linux XFCE x64/ Fedora Linux Cinnamon x64 / Windows 10 x64
on various Hardware Platforms (Notebook and Desktop)
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Random Files schreiben

Beitrag 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
a²+b²=mc²
Antworten