Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
0 / 0 / 0
Регистрация: 04.12.2015
Сообщений: 5

Нехватка памяти при чтении/записи файлов

04.12.2015, 14:31. Показов 2272. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!
Возникла проблема при работе программы, которая должна открывать текстовый файл, читать его, кодировать и записывать в новый txt. Файлы очень большие (не менее 1ГБ текста). Все работает, но ест оперативную память (а требуется работа не очень слабеньких компах).
Не могу понять что не так. Как я понимаю, чтение и запись не должны осуществлять хранение всего файла в память.
Очень нужна помощь.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#include <cstdlib>
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <vector>
#include "sha1.h"
#include <cstring>
#include <cstdio>
 
using namespace std;
 
int main(int argc, char* argv[])
{
    char input_string[65536], string_to_encode[65536], not_coded_data[65536];
    int i, str_len, j, k;
    string encoded_string, string_to_encode_string, input_string_string; 
    //ifstream input_stream; как вариант написано и с потоками, но разницы нет
    FILE * output_file;
    FILE * input_file;
 
    if (argc > 2)
    {
        //input_stream.open(argv[1]);
        input_file = fopen( argv[1] , "r" );
        output_file = fopen( argv[2] , "w" );
    } 
    else
    {
        cout << "No data files set" << endl;
        cout << "Input data file name: ";
        cin >> input_string;
 
        //input_stream.open(input_string);       как вариант написано и с потоками, но разницы нет
        input_file = fopen( input_string , "r" );
 
        /* clear previous string in case of next is shorter than previous */
        memset(input_string, 0, sizeof input_string);
 
        cout << "Output data file name: ";
        cin >> input_string;
        output_file = fopen( input_string, "w" );
   }
  
    while (!feof(input_file))
    {   
        //input_stream.getline(input_string, 65536);   как вариант написано и с потоками, но разницы нет
        fgets(input_string, 65536, input_file)
        str_len = strlen(input_string);
 
        i=0;
 
        input_string_string = string(input_string);
        if ((strstr(input_string, ";") == NULL) && (!input_string_string.empty()))
        {
            input_string[0] = 0;
        }
        
        
        while (input_string[i] != ';')
        {
            string_to_encode[i] = input_string[i];
            i++;
        }
 
        k = 0;
        for (int j = i++; j <= str_len; ++j)
        {
            not_coded_data[k] = input_string[j];
            k++;
        }
 
        string_to_encode_string = string(string_to_encode);
        if (!string_to_encode_string.empty())
        {
            encoded_string = sha1(string_to_encode);
 
            /* make fputs work */
            const char * coded = encoded_string.c_str();
            fputs(coded, output_file);
 
            fputs(not_coded_data, output_file);
            fputs("\n", output_file); 
            memset(string_to_encode, 0, sizeof string_to_encode);
            memset(not_coded_data, 0, sizeof not_coded_data);
        }
 
 
    }
 
    //input_stream.close(); как вариант написано и с потоками, но разницы нет
    fclose(input_file);
    fclose(output_file);
    cout << "Encoding complete" << endl; 
 
    return 0;
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.12.2015, 14:31
Ответы с готовыми решениями:

Ошибка при чтении/записи файлов произвольного доступа при данных 0x0A (получается 0x0D0A)
Программа формирует, читает, модифицирует файл произвольного доступа. вот задание на программу: Дана последовательность b1...b40....

Нехватка памяти при выбросе исключения
Собственно, наткнулся на проблему //Если здесь для создания std::string не хватит памяти, то вылетит std::bad_alloc, вместо...

Нехватка памяти при создании динамических объектов
Создаю 4 динамических объекта. 3 вектора и матрица. матрица - это результат перемножения двух векторов. третий вектор- это суммы...

9
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
04.12.2015, 14:37
И в чём нехватка памяти? Программа с такой ошибкой завершается?
Сколько памяти используется, если файл 1Гб?
0
0 / 0 / 0
Регистрация: 04.12.2015
Сообщений: 5
04.12.2015, 14:43  [ТС]
Маленькие файлы работают нормально. А вот большие съедают всю память и программа падает с ощибкой нехватки памяти.
Памяти свободной должно быть мало, ну порядка 1 Гб. А требует программа при работе примерно в два раза больше размера исходного текстового файла
Спасибо за ответ!
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
04.12.2015, 15:06
Опиши словами, как обрабатывается текст. Если выполнится 56-я строка, то 60-я уйдёт неизвестно куда.
0
0 / 0 / 0
Регистрация: 04.12.2015
Сообщений: 5
04.12.2015, 15:18  [ТС]
После открытия файла пока не достигнут конец файла считывается строка (набор информации, разделенной ; ).
Далее на 54 строке проверяется, что это не шум и не пустая строка (по хорошему таких строк не должно быть и стр 56 не выполняется).
Далее на 60 стр считывается информация до первой ; и записыввается в новую переменную string_to_encode. Остаток строки записывается еще в одну переменную not_coded_data.
Далее на стр 74 идет кодировка, если строка не пустая
Дальше запись в файл и закрытие.
Пробовала сбрасывать буфер записи в файл каждые 100 строк, но ничего не поменялось.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
04.12.2015, 16:12
Лучший ответ Сообщение было отмечено need_some_help как решение

Решение

sha1() принимает обычную строку, а возвращает string? Так попробуй:
C++
1
2
3
4
5
6
7
8
9
10
    while (fgets(input_string, 65536, input_file) != NULL)
    {   
        if (sscanf(input_string, "%[^;];%s", string_to_encode, not_coded_data) != 2) continue;
 
        encoded_string = sha1(string_to_encode);
 
        fputs(encoded_string.c_str(), output_file);
        fputs(not_coded_data, output_file);
        fputs("\n", output_file); 
    }
И что в sha1? Может, там утечка? Попробуй просто запись этим же циклом заменив эту строку на
C++
1
encoded_string = string_to_encode;
0
0 / 0 / 0
Регистрация: 04.12.2015
Сообщений: 5
04.12.2015, 22:40  [ТС]
Спасибо!
Как это не плачевно, но корень зла оказался как раз в sha1(). Это не моя прога, так что и в голову не приходило ее проверить. Я не про, так что в чужой код , увы, верю без задних мыслей.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
04.12.2015, 22:44
Так зачем там столько лишнего-то?
0
265 / 165 / 56
Регистрация: 25.02.2015
Сообщений: 435
04.12.2015, 22:55
не совсем понятно разобрались тут или нет. если нехватка памяти связана с тем что хеш нужно считать для львинной доли данных большого файла - то в том варианте функции, которая у вас проблема не решится. если функия на вход хочет строку, то надо этой функции отдавать всю строку. т.е. читать этот файл в память. однако, такие штуки как правило имеют стримоподобные аналоги. если образно, то создается некий объект ему данные отдаются кусками. когда куски закончились объекту говорят что мол мы закончили. вот теперь отдавай хеш всех тех кусков, которые мы тебе скармливали.
0
0 / 0 / 0
Регистрация: 04.12.2015
Сообщений: 5
05.12.2015, 16:04  [ТС]
Спасибо, разобрались.
Все оказалось сильно проще. В чужом коде был один не закрытый malloc, который все и ел. Закрали его, все теперь работает на любых файлах.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.12.2015, 16:04
Помогаю со студенческими работами здесь

Абракадабра при записи в файл и при чтении из него кириллицы
#include &lt;iostream&gt; #include &lt;fstream&gt; using namespace std; int main() { ofstream f(&quot;text.dat&quot;); f &lt;&lt; &quot;Тест&quot;; ...

Утечка памяти при первом чтении из файла
Во время выполнения своей программы обнаружил, что heap был поврежден При проведении &quot;расследования&quot; обнаружил, что при первом...

Крашится приложение при чтении адреса памяти
Здравствуйте. Мой скрипт работает с другой офисной программой с помощью инжекта, помогая клиенту автоматизировать некоторые действия. Мне...

Ошибки при записи и чтении из файла
double calc(int n, double sum, int a, int b, double p, double f) { if(n == 0) return sum; else{ sum += p...

Ошибка при чтении/записи из бинарного файла
Сделал простую программу для работы с бинарными файлами, но когда запускаю ее вылетает ошибка. Сделать проще уже некуда, в чем проблема? ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru