Zum Inhalt springen

"nicht genügend Speicher" abfangen


Technician

Empfohlene Beiträge

Hallo,

ich lese in meiner Anwendung sehr große Textdateien ein.

Sind die Dateien zu groß (z.B. 700-MB-Textfile :eek: ), gibt's logischerweise Probleme.

In diesem Fall erscheint eine MessageBox "Nicht genügend Speicher" (das Programm stürzt aber nicht ab).

Dieses Fehlerhandling scheint mir "automatisch" implementiert zu sein.

Nun: danach ist die Datei aber noch als "geöffnet" markiert. Soll heißen, vor einem Neustart kann die Datei nicht mehr umbekannt, verschoben etc. werden.

Die Datei sollte aber im Fehlerfall geschlossen werden.

Ich habe nun einen try-catch-Block eingefügt und fange CFileException und CMemoryException ab. Jedoch ist es anscheinend eine andere Exception.

Kann mir jemand sagen, welche das ist :confused:

Grüße,

Technician

Link zu diesem Kommentar
Auf anderen Seiten teilen

Originally posted by Guybrush Threepwood

Hi,

also meiner Meinung nach sollte es eigentlich einer dieser beiden Exceptions sein.

Was passiert nach der Fehlermeldung? Mußt du dein Programm selber schließen,

oder wird es automatisch beendet, oder stürzt es dann ab?

Gruß

Guybrush

Die MessageBox hat nur einen OK-Button.

Wenn ich den drücke, wird das Anlegen des Dokuments (das mit der zu öffnenden Datei angelegt werden sollte) beendet, und die Anwendung läuft normal weiter.

Ich kann dann erneut eine Datei öffnen (oder was immer ich machen will).

Nur eben, die Datei wird nicht wirklich geschlossen (vor einem Neustart des Rechners kann ich die Datei nicht mehr bearbeiten).

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wenn ich den drücke, wird das Anlegen des Dokuments (das mit der zu

öffnenden Datei angelegt werden sollte) beendet, und die Anwendung läuft normal

weiter.

Du hast doch ein HANDLE oder ein Objekt das mit der Datei verbunden wird,

ist das nach dem Fehler noch gültig? Wenn ja müßte man doch darüber

die Datei "richtig" schließen können.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Originally posted by Guybrush Threepwood

Du hast doch ein HANDLE oder ein Objekt das mit der Datei verbunden wird,

ist das nach dem Fehler noch gültig? Wenn ja müßte man doch darüber

die Datei "richtig" schließen können.

Ja, ich hab ein gültiges Objekt.

Aber mein Problem ist ja, dass ich in keinen catch-Block "reinlaufe":


try

{


	file = new CStdioFile(lpszPathName, CFile::modeRead);

	file->GetStatus(status);

	file->SeekToBegin();


	file->ReadString(data);

	filepos = 0;


	dateiLaenge = file->GetLength();



	/*Erstell-Datum der Datei ermitteln*/

	pFile->SetFileDatum(status.m_ctime);


	/*Zeilenlänge ermitteln*/

	zeilenLaenge = data.GetLength();

	pFile->SetFileLengthVorKonv(zeilenLaenge);


	pFile->SetDateiLaenge(dateiLaenge);

}


catch(CFileException)

{

	file->Close();

	AfxMessageBox("file");

}

catch(CMemoryException)

{

	file->Close();

	AfxMessageBox("memory");

}


// und hier wird weiter ausgelesen...


Momento *grübel*....

kann es nicht sein, dass die ganze Misere erst bei "und hier wird weiter ausgelesen" passiert?! Ich mach ja jetzt noch mal nen try-catch-Block rein, und teste das nochmal aus *wenn-das-bloß-nicht-so-lange-dauern-würde*

Link zu diesem Kommentar
Auf anderen Seiten teilen

kann es nicht sein, dass die ganze Misere erst bei "und hier wird weiter

ausgelesen" passiert?!

Könnte natürlich auch sein, aber wenn dein Objekt noch gültig ist könntest du

doch versuchen die Datei zu schließen bevor eine andere geöffnet wird oder

das Programm beendet wird, egal ob ein Fehler aufgetreten ist oder nicht.

*wenn-das-bloß-nicht-so-lange-dauern-würde*

:D Das kenn ich

Link zu diesem Kommentar
Auf anderen Seiten teilen

Originally posted by Guybrush Threepwood

Könnte natürlich auch sein, aber wenn dein Objekt noch gültig ist könntest du

doch versuchen die Datei zu schließen bevor eine andere geöffnet wird oder

das Programm beendet wird, egal ob ein Fehler aufgetreten ist oder nicht.

Schließen, bevor eine andere geöffnet wird - passiert normalerweise sowieso.

Nach der Abarbeitung hab ich ein

file->Close();

Nur kann das ja logischerweise im Fehlerfall nicht mehr klappen...

Originally posted by Guybrush Threepwood

:D Das kenn ich

Es dauert ja immer so lange, bis die Datei geöffnet wird, und ich muss die Test-Datei immer erst durch Kopieren einer anderen erzeugen (auf nem lahmen Netzlaufwerk dauert die Prozedur dann so ein halbes Stündchen...)

Weiß daher noch nicht, ob der Fehler wirklich erst beim "weiter einlesen" auftritt.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Nur kann das ja logischerweise im Fehlerfall nicht mehr klappen...

Warum? wenn dein Objekt nach dem Fehler noch Gültig ist, dann muß er es

ja auch schließen können.

Kuck mal was Close() für einen Fehler verursacht.

(auf nem lahmen Netzlaufwerk dauert die Prozedur dann so ein halbes

Stündchen...)

:eek: Das ist extrem lange, ich hab mal ne Datenbankanwendung geschrieben,

da hat er bei einer Tabel mit ca 100000 Datensätzen jedesmal 1-2 Minuten

geldaen und das war mir schon zuviel

Link zu diesem Kommentar
Auf anderen Seiten teilen

Originally posted by Guybrush Threepwood

Warum? wenn dein Objekt nach dem Fehler noch Gültig ist, dann muß er es

ja auch schließen können.

Ich meinte: er kommt gar nicht mehr bis zum "normalen" Schließen, da dies erst nach der Verarbeitung passiert.

Normalfall:

Datei öffnen

Daten auslesen

Daten auslesen

Daten auslesen

Daten auslesen

Datei schließen

Fehler:

Datei öffnen

Daten auslesen

"nicht genügend Speicher"

Das close würde schon noch funktionieren - wenn er überhaupt da hin kommen würde;)

Kuck mal was Close() für einen Fehler verursacht.

wie gesagt, keinen - er kommt einfach nimmer da hin

Der "Testfall Nummer Sowieso" ist jetzt wieder da - seltsamerweise kommt jetzt die MessageBox "Nicht genügend Speicher" gar nicht mehr (besser gesagt, erst nachdem ich den Button zum Schließen des Programms angeklickt habe und das Programm auch schon weg vom Bildschirm ist).

Meine MessageBoxen in den catch-Blöcken werden nicht angezeigt.

Und die Datei ist noch immer "gesperrt".

Originally posted by Guybrush Threepwood

:eek: Das ist extrem lange, ich hab mal ne Datenbankanwendung geschrieben,

da hat er bei einer Tabel mit ca 100000 Datensätzen jedesmal 1-2 Minuten

geldaen und das war mir schon zuviel

bin daran gewöhnt - fünf Minuten auf was warten ist bei uns schon äußerst wenig; auch wenn die Verbindung zum RZ (RechenZentrum) einwandfrei ist.

Fehler in SQL-Batches mit Laufzeiten von 2 Stunden suchen is auch was feines ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das close würde schon noch funktionieren - wenn er überhaupt da hin

kommen würde

Ok, aber du könntest vor dem öffnen einer Datei und vor dem schließen des

Programms prüfen ob du ein gültiges Dateiobjekt hast und wenn ja

versuchen dieses zu schließen. Dann würde Close() zumindest immer

aufgerufen werden.

Fehler in SQL-Batches mit Laufzeiten von 2 Stunden suchen is auch was feines

Das grenzt ja schon an Azubi-Quälerei:)

***edit***

Du könntest wenn das Programm nur bei dir laufen soll natürlich auch

einfach die Auslagerungsdatei vergrößern, obwohl das natürlich keine

richtige Lösung ist.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Originally posted by Guybrush Threepwood

Ok, aber du könntest vor dem öffnen einer Datei und vor dem schließen des

Programms prüfen ob du ein gültiges Dateiobjekt hast und wenn ja

versuchen dieses zu schließen. Dann würde Close() zumindest immer

aufgerufen werden.

ja - probier ich aus!

Originally posted by Guybrush Threepwood

Das grenzt ja schon an Azubi-Quälerei:)

... hat nix mit Azubi zu tun - muss hier jeder machen :cool: (it's our daily business :D)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Originally posted by Guybrush Threepwood

***edit***

Du könntest wenn das Programm nur bei dir laufen soll natürlich auch

einfach die Auslagerungsdatei vergrößern, obwohl das natürlich keine

richtige Lösung ist.

Neee, ausgeschlossen.

Das ganze soll nicht nur bei mir laufen, sondern das benutzen ca. 100 User, und zwar immer wieder an anderen Rechnern.

Und die Dateien können sogar so groß sein, dass das mit dem Auslagern nimmer sooo ideal ist (kann auch mal ne Datei mit 4 Gig sein, oder dass jemand drei, vier, fünf... solche 700-MB-Dateien öffnen will...)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Originally posted by Klotzkopp

Dann würde ich empfehlen, die Dateien nicht vollständig einzulesen.

Die Dateien werden auch nicht vollständig eingelesen. Soll heißen: zwar größere Datenblöcke, aber nicht komplett.

Zum Bearbeiten wirklich extrem großer Dateien (z.B. 100 MB aufwärts) ist die Anwendung auch nicht gedacht --> da gibt's ne Vorverarbeitung zum Splitten.

Das mit den 700-MB-Dateien heute war (bzw. ist) "nur" zum Austesten, was passiert, wenn trotzdem jemand derart große Dateien öffnen würde.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...