ofstream und starke Speicherbelegung
-
Hallo, ich ein Programm geschrieben das mir die Ordnerstruktur eines Verzeichnisses ausliest. Die Pfade der Ordner und Unterordner speichere ich in einer Liste und lese dann alle Dateien in einem Ordner und schreibe die Dateien dann direkt in eine datei weg.
Das funktioniert soweit wunderbar. Wenn ich aber mal einen Ornder wie "Programme" mit seinen tausenden von Unterordnern auslese und dann diese Methode hier aufrufe nimmt sich das programm immer mehr speicher.
das geht dann sogar soweit, dass der ram nicht mehr reicht(ich habe 1GB Ram) und windows-anfangen muss dateien auszulagern. wie kann ich dieses extrem speicherfressende laufzeit verhalten abstellen?
hier mal der code der besagte methode
// Liest die Dateien in einem Ordner und schreibt diese direkt Weg. bool FileManager::readFiles_WriteToFile(std::list<std::wstring> directoryList, std::wstring filePath) { //Prüfen ob es Ausgabedatei schon gibt std::ifstream openTest(filePath.c_str()); if (openTest) return false; //Ausgabedatei eröffnen std::ofstream outfile(filePath.c_str(), std::ios::binary | std::ios::out); std::list<std::wstring>::iterator it; for (it = directoryList.begin(); it != directoryList.end(); it++) { WIN32_FIND_DATA fd; TCHAR szDir[MAX_PATH]; HANDLE hFind; //Pfad mit Wildcard ergänzen StringCchCopy(szDir, MAX_PATH, it->c_str()); StringCchCat(szDir, MAX_PATH, TEXT("\\*")); //erste Datei lesen '.' hFind = FindFirstFile(szDir, &fd); if (hFind == INVALID_HANDLE_VALUE) return false; else { //zweite Datei lesen '..' FindNextFile(hFind, &fd); //Ab jetzt echte Dateien, solange lesen bis Verzeichnis durchgelesen wurde while (FindNextFile(hFind, &fd) != 0) { //Ordner und versteckte Dateien nicht ausgeben if (fd.dwFileAttributes & (FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_HIDDEN)) continue; //li.push_back(std::wstring(fd.cFileName)); FileInfo x(getFileNameWithoutFileType(std::wstring(fd.cFileName),true), extractFileType(std::wstring(fd.cFileName),true), removeSpecialCharacter(readTitelOfFileEx(std::wstring(it->c_str()), std::wstring(fd.cFileName))), std::wstring(std::wstring(it->c_str())+= L"\\" + std::wstring(fd.cFileName))); outfile<<x.convertWStringToString(x.getFilePath()).c_str()<<";" <<x.convertWStringToString(x.getFileName()).c_str()<<";" <<x.convertWStringToString(x.getTitelText()).c_str()<<";" <<x.convertWStringToString(x.getDocTyp()).c_str()<<";\n"; } //Handle schließen FindClose(hFind); } } return true; }Das Objekt FileInfo ist ein Objekt das mir eine Methode bereitstellt um von Wide-char auf multibyte zu konvertieren
FileInfo::FileInfo(std::wstring name, std::wstring typ, std::wstring titel, std::wstring path): m_fileName(name), m_docTyp(typ), m_titelText(titel), m_filePath(path) { }std::string FileInfo::convertWStringToString(std::wstring in) { char charArr[1024]={0}; WideCharToMultiByte(CP_ACP, NULL, in.c_str(), static_cast<int>(in.length()), charArr, static_cast<int>(in.length()), NULL, NULL); return std::string(charArr); }
-
keiner eine Idee ?
-
Wenn man Probleme mit dem Speicherplatz hat, dann hilft seit altersher eine Datei auf der Festplatte!
-
mein problem ist ja grade das wegschreiben in eine datei!
während des wegschreiben nimmt sich das programm immer mehr speicher. wenn die liste im speicher erstellt ist, sind grade mal 3-4MB belegt, das ist absolut ok.
nur wenn er anfängt weg zuschreiben belegt er immer mehr speicher. der speicher wird zudem auch erst wieder freigegeben, wenn man das programm beendet.
deswegen versteh ich das halt nicht was ich falsch mache. ich arbeite zudem auch nur auf dem stack und nicht auf dem heap, von daher sollte sich der speicher ja selbst weider freigeben.(was ja auch passiert, halt erst beim programm beenden).
-
Ich bin zu faul, Deinen Sourcecode auf mögliche Fehler zu durchsuchen. Der Stack ist eigentlich dafür da, kleine Datenmengen zwischen Funktionen auszutauschen. Was draufgelegt wird, muss auch wieder abgeräumt werden. Dateien lesen und schreiben beansprucht wenig Speicherplatz auf dem Heap.
-
Tu doch einfach mal Schritt für Schritt Sachen auskommentieren und ausprobieren. Wenn du dann siehst dass wenn du Zeile X auskommentierst der Speicherverbrauch "normal" wird hast du den Untäter gefunden.