Vba, Fehler: Nicht genügend Speicher

Hallo Wissende,

beim Versuch eine Frage aus dem Textbrett:
/t/nicht-textverarbeitung-aber-massentext/5682525
zu lösen kommt bei folgendem Word2000-Vba-Code Fehler 7, nicht genügend Speicher in der Put-zeile.

Sub Gross()
Dim Satz As String
Satz = String(261292013, „A“)
'MsgBox Len(Satz)
Close
Open „c:\test\gross.txt“ For Binary As #1
Put #1, , Satz
Close
End Sub

Jetzt habe ich schon eine zeitlang zugebracht um die Limitation der String-Funktion, also diese 261292013 herauszufinden.

Jetzt kann ich zwar die Länge von „Satz“ verringern bis kein Fehler mehr kommt, das nützt mir aber nix, da ja der Anfrager als Ergebnis eine bis zu 2 GB große Textdatei möchte.
Am besten noch mit Zufallszeichen drin.

Habt ihr Ideen wie man das angehen könnte?
Ich kann zwar die neue Datei mit „For Input“ öffnen und dann rel. kleine Sätze nacheinander reinschreiben mit „Print“, aber bei 2 GB glaube ich daß dies lange dauert.

Aus dem zeitgrund habe ich dem Anfrager abgeraten von Zufallszeichen, das dauert ja noch viel länger als nur ein Zeichen.

Kompromiß wäre, „zufällig“ eine x Bytes lange Zeichenfolge zu erzeugen und die dann zigmal nacheinander in die datei schreiben.

M.E. nach ist es egal ob VB-Code oder Vba-Code, kann sich höchstens Versionsabhängig bei evtl. Limintationen unterscheiden.
Also daß man mit VB5.0 per Print nur 2 MB große Sätze schreiben kann und mit VB6.0 32 MB große Sätze oder sowas.

Danke und Gruß
Reinhard

Hallo Wissende,

Hallo Reinhard

beim Versuch eine Frage aus dem Textbrett:
/t/nicht-textverarbeitung-aber-massentext/5682525
zu lösen kommt bei folgendem Word2000-Vba-Code Fehler 7, nicht
genügend Speicher in der Put-zeile.

Welches OS liegt denn vor? Wie viel Arbeitsspeicher steht denn zur Verfügung und ist frei?

Sub Gross()
Dim Satz As String
Satz = String(261292013, „A“)
'MsgBox Len(Satz)
Close
Open „c:\test\gross.txt“ For Binary As #1
Put #1, , Satz
Close
End Sub

Jetzt habe ich schon eine zeitlang zugebracht um die
Limitation der String-Funktion, also diese 261292013
herauszufinden.

Jedes Zeichen belegt 2 Byte! Das wiederrum bedeutet bei einer Länge von 2GB = 4GB Speicherplatz!

Jetzt kann ich zwar die Länge von „Satz“ verringern bis kein
Fehler mehr kommt, das nützt mir aber nix, da ja der Anfrager
als Ergebnis eine bis zu 2 GB große Textdatei möchte.

Ja aber was spricht dagegen es in kleine haeppchen zu schnippeln und diese dann zu schreiben?

Am besten noch mit Zufallszeichen drin.

Sollte kein Problem sein :smile:

Habt ihr Ideen wie man das angehen könnte?

In einer Routine erstmal den Höchstmöglichsten Wert ermitteln, und dann in einer Schleife einfach den String mit Zufallswerten befuellen und dann ins File schreiben.

Ich kann zwar die neue Datei mit „For Input“ öffnen und dann
rel. kleine Sätze nacheinander reinschreiben mit „Print“, aber
bei 2 GB glaube ich daß dies lange dauert.

Denke ich nicht! Das waeren rein aus dem Bauch herraus und je nach Rechner und OS system vlt. 2 bis 3 Durchlaeufe, was sich ergo unter 2 Sekunden realisieren laesst.

Aus dem zeitgrund habe ich dem Anfrager abgeraten von
Zufallszeichen, das dauert ja noch viel länger als nur ein
Zeichen.

Richtig. Stellt sich hier aber die Frage. Was will er mit dem File ? Muessen es bindend zufallszeichen sein ? Würde auch der Datentyp Byte gehen ?

Kompromiß wäre, „zufällig“ eine x Bytes lange Zeichenfolge zu
erzeugen und die dann zigmal nacheinander in die datei
schreiben.

Richtig, oder halt die Daten als Bytes schreiben. Sprich 0 oder 1 :wink: Das würde m.E schneller gehen!

M.E. nach ist es egal ob VB-Code oder Vba-Code, kann sich
höchstens Versionsabhängig bei evtl. Limintationen
unterscheiden.
Also daß man mit VB5.0 per Print nur 2 MB große Sätze
schreiben kann und mit VB6.0 32 MB große Sätze oder sowas.

Danke und Gruß
Reinhard

Ich probiere mal fix was :wink: und meld mich dann wieder.
By the Way … Schau mal hier

http://www.meinews.net/kann-t438680.html

MfG Alex

Hallo Alex,

beim Versuch eine Frage aus dem Textbrett:
/t/nicht-textverarbeitung-aber-massentext/5682525
zu lösen kommt bei folgendem Word2000-Vba-Code Fehler 7, nicht
genügend Speicher in der Put-zeile.

Welches OS liegt denn vor? Wie viel Arbeitsspeicher steht denn
zur Verfügung und ist frei?

k.A., ich gehe von irgendeinem Windows aus.

Jedes Zeichen belegt 2 Byte! Das wiederrum bedeutet bei einer
Länge von 2GB = 4GB Speicherplatz!

Nein, in dem Fall nicht.
Im unten nachfolgenden Code wird bei f.size 200000000, also 200 Millionen Bytes angezeigt.
Explorer zeigt 195313 KB an. Was wohl richtig ist wegen 200000000/1024=195312,5.
(Ich habe 200 MB genommen weil mir 2 GB zum Testen zu lange laufen, mal weglassend daß es sich um MiBi und GiBi handelt *gg*)

Jetzt kann ich zwar die Länge von „Satz“ verringern bis kein
Fehler mehr kommt, das nützt mir aber nix, da ja der Anfrager
als Ergebnis eine bis zu 2 GB große Textdatei möchte.

Ja aber was spricht dagegen es in kleine haeppchen zu
schnippeln und diese dann zu schreiben?

Mußte ich notgedrungen machen, siehe Code.

Am besten noch mit Zufallszeichen drin.

Sollte kein Problem sein :smile:

Nein, nur ein Zeitproblem.

Habt ihr Ideen wie man das angehen könnte?

In einer Routine erstmal den Höchstmöglichsten Wert ermitteln,
und dann in einer Schleife einfach den String mit
Zufallswerten befuellen und dann ins File schreiben.

Okay, die Ermittlung des Höchstwertes hat mir zu lang gedauert :smile:, ich hab einfach mal im Code 100 Millionen genommen als Häppchengröße genommen.

Ich kann zwar die neue Datei mit „For Input“ öffnen und dann
rel. kleine Sätze nacheinander reinschreiben mit „Print“, aber
bei 2 GB glaube ich daß dies lange dauert.

Denke ich nicht! Das waeren rein aus dem Bauch herraus und je
nach Rechner und OS system vlt. 2 bis 3 Durchlaeufe, was sich
ergo unter 2 Sekunden realisieren laesst.

Bei mir WinXP, Pentium® 4 mit 1,7Ghz, 512 MB RAM, braucht mein Code aber schon gefühlte 3 Minuten für eine Datei von 200 Mio Bytes.
Noch dazu ohne Zufallszeichen.

Aus dem zeitgrund habe ich dem Anfrager abgeraten von
Zufallszeichen, das dauert ja noch viel länger als nur ein
Zeichen.

Richtig. Stellt sich hier aber die Frage. Was will er mit dem
File ? Muessen es bindend zufallszeichen sein ? Würde auch der
Datentyp Byte gehen ?

k.A. sehr aktiv ist er in der beitragsfolge nicht grad *gg*

Kompromiß wäre, „zufällig“ eine x Bytes lange Zeichenfolge zu
erzeugen und die dann zigmal nacheinander in die datei
schreiben.

Richtig, oder halt die Daten als Bytes schreiben. Sprich 0
oder 1 :wink: Das würde m.E schneller gehen!

0,1? Bytes, Bits, komme grad durcheinander :frowning:

Ich probiere mal fix was :wink: und meld mich dann wieder.
By the Way … Schau mal hier

„fix“ *hüstel* *lächel*

http://www.meinews.net/kann-t438680.html

Bin ich noch am Lesen und verstehen wollen.

Sub gross()
Dim N As Long, Anz As Long, Satz As String, DG As Long, Teil As Long
DG = 200000000
Teil = 99999998
Anz = Int(DG / Teil)
Close
Open "C:\test\gross.txt" For Output As #1
Satz = String(Teil, "A")
For N = 1 To Anz
 Print #1, Satz
Next N
If DG - Anz \* (Teil + 2) - 2 \>= 0 Then Print #1, Left(Satz, DG - Anz \* (Teil + 2) - 2)
Close #1
Call Anzeige
End Sub
'
Sub Anzeige()
Dim fs, f
Set fs = CreateObject("Scripting.FileSystemObject")
Set f = fs.GetFile("C:\test\gross.txt")
MsgBox f.Size
End Sub

Gruß
Reinhard

Hallo Reinhard,

k.A., ich gehe von irgendeinem Windows aus.

Wenn du auf der Seite gelesen hast, macht es imenze Unterschiede je nachdem auf Welchen OS es läuft. Streckenweise hast du nur 64Kb an Speicher zur Verfügung :frowning:

Nein, in dem Fall nicht.
Im unten nachfolgenden Code wird bei f.size 200000000, also
200 Millionen Bytes angezeigt.
Explorer zeigt 195313 KB an. Was wohl richtig ist wegen
200000000/1024=195312,5.
(Ich habe 200 MB genommen weil mir 2 GB zum Testen zu lange
laufen, mal weglassend daß es sich um MiBi und GiBi handelt
*gg*)

Da hast du mich falsch verstanden ;( Mit der Aussage das jedes Zeichen 2 Byte belegt, war auf VB und deren internen Speicherreservierung bezogen. Steht glaube auch auf der Seite, wenn ich mich recht entsinne :wink:

Nein, nur ein Zeitproblem.

Richtig, das du so oder so hast :confused:

Okay, die Ermittlung des Höchstwertes hat mir zu lang gedauert

-), ich hab einfach mal im Code 100 Millionen genommen als

Häppchengröße genommen.

Bei mir hat das nur gestartet von 2 GB, gerade mal 9,005 Sekunden gedauert :wink:

Ich kann zwar die neue Datei mit „For Input“ öffnen und dann
rel. kleine Sätze nacheinander reinschreiben mit „Print“, aber
bei 2 GB glaube ich daß dies lange dauert.

Ich hatte glaube einen Wert von 196509878 oder so gehabt. Also waeren es nicht allzu viele Durchlaeufe gewesen. Aber dies zu testen, dazu kam ich nicht, da genau in dem Moment, wo ich die Sub fertig getippselt habe, mein VB abschmierte und ich es nicht gespeichert hatte :confused: *grml*

Aber so viele Durchlaeufe sind das nicht und ich denke mal, das man das alles zusammen so pi mal daumen binnen 30 Sekunden haette machen können.

Aber, mal was anderes. Punkto API. Gibt es da zufaellig eine?
Und was mir auch noch einfaellt. Das man dieses File mit Zufallszahlen füllen soll, das dies dann Arsch lange dauert ist klar. Dabei ist das füllen der grösste und Intensivste aufwand!
Sollte man dies aber nicht benötigen. Wie waere es dann, wenn man einfach die Shell dazu nutzt und auf Windows Bordmittel zurueckgreift?

Start -> Ausführen -> Cmd
und dann gib ma folgendes ein

fsutil file createnew c:\gross.txt 2147483648

Was meinste denn was da binnen 1 Sekunde geschehen ist, sofern auf dem Laufwerk C die Datei gross.txt nicht existiert :wink:

Bei mir WinXP, Pentium® 4 mit 1,7Ghz, 512 MB RAM, braucht
mein Code aber schon gefühlte 3 Minuten für eine Datei von 200
Mio Bytes.
Noch dazu ohne Zufallszeichen.

Ach herje ;/

k.A. sehr aktiv ist er in der beitragsfolge nicht grad *gg*

Und warum bemuehst du dich dann so?

0,1? Bytes, Bits, komme grad durcheinander :frowning:

Ich meinte wenn nur Daten vom Datentyp Boolean eintragen willst, also entweder eine 1 oder eine 0

„fix“ *hüstel* *lächel*

Jups, bin auch grad nen bissl am verzweifeln :frowning:

http://www.meinews.net/kann-t438680.html

Bin ich noch am Lesen und verstehen wollen.

Hast du es verstanden?

Das was ich aktuell habe, legt dir ne Datei mit „A“ an 1:15 :frowning:

Option Explicit

Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, ByRef lpSecurityAttributes As Any, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
Private Declare Function WriteFile Lib "kernel32.dll" (ByVal hFile As Long, ByRef lpBuffer As Any, ByVal nNumberOfBytesToWrite As Long, ByRef lpNumberOfBytesWritten As Long, ByVal lpOverlapped As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

Private Const GENERIC\_WRITE As Long = &H40000000
Private Const GENERIC\_READ As Long = &H80000000
Private Const FILE\_SHARE\_READ As Long = &H1
Private Const FILE\_SHARE\_WRITE As Long = &H2
Private Const OPEN\_ALWAYS As Long = 4
Private Const INVALID\_HANDLE\_VALUE As Long = -1

Private Sub Command1\_Click()
 Dim hFile As Long, retVal As Long, BytesWritten As Long, I As Byte
 Dim TextToWrite As String
 TextToWrite = String(2147483648# / 15, "A")
 hFile = CreateFile("C:\Gross2.txt", GENERIC\_WRITE, FILE\_SHARE\_READ Or FILE\_SHARE\_WRITE, ByVal 0&, OPEN\_ALWAYS, 0&, 0&amp:wink:
 If hFile = INVALID\_HANDLE\_VALUE Then
 Call MsgBox("Es ist ein Fehler beim Aufruf an CreateFile aufgetreten.")
 Exit Sub
 End If
 For I = 1 To 15
 retVal = WriteFile(hFile, ByVal TextToWrite, Len(TextToWrite), BytesWritten, 0&amp:wink:
 If retVal = 0 Then
 Call MsgBox("Es ist ein Fehler beim Aufruf an WriteFile aufgetreten.")
 Exit For
 End If
 Next
 Call CloseHandle(hFile)
 MsgBox "Fertsch..."
End Sub

Gruß
Reinhard

MfG Alex