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

Программа виснет при чтении большого файла

09.05.2020, 19:33. Показов 1087. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем в очередной раз здравствуйте и простите за то что я пока ещё не в состоянии сам разбираться с такими проблемами.

Задача:
Прочитать текстовый файл размером около 500МБ и имеющий 8120606 строк. В 3 массива.

Код:
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
StreamReader^ sr = gcnew StreamReader(openfile->FileName);
                int NxINF = Convert::ToInt32(datagrid[1, 7]->Value->ToString());
                int NyINF = Convert::ToInt32(datagrid[1, 8]->Value->ToString());
                int NzINF = Convert::ToInt32(datagrid[1, 9]->Value->ToString());
                int NxyzINF = (NxINF + 1) * (NyINF + 1) * (NzINF + 1);
                double* EXINF = new double[NxyzINF + 1];
                double* EYINF = new double[NxyzINF + 1];
                double* EZINF = new double[NxyzINF + 1];
                int i, j, k, s;
                array<String^>^ EXYZINF = gcnew array<String^>(3);
                statusbar->Maximum = NxINF;
                statuslable->Text = "Loading TOSCA table file...";
                Application::DoEvents();
                for (size_t p = 0; i < 5; i++)
                {
                    sr->ReadLine();
                }
                while (!sr->EndOfStream && (j < NxINF + 1))
                {
                    for (j = 0; j < NxINF + 1; j++)
                    {
                        statusbar->Value = j;
                        Application::DoEvents();
                        for (i = 0; i < NyINF + 1; i++)
                        {
                            for (k = 0; k < NzINF + 1; k++)
                            {
                                s = k + i * (NzINF + 1) + j * (NzINF + 1) * (NyINF + 1);
 
                                EXYZINF = sr->ReadLine()->Split(gcnew array<String^>{" "}, StringSplitOptions::RemoveEmptyEntries);
                                EXINF[s] = double::Parse(EXYZINF[0]);   // V/m
                                EYINF[s] = double::Parse(EXYZINF[1]);
                                EZINF[s] = double::Parse(EXYZINF[2]);
                            } //i
                        } //j
                    } //k
                }
                sr->Close();
 
                delete[] EXINF;
                delete[] EYINF;
                delete[] EZINF;
Проблема:
В режиме Debug программа идеально работает довольно быстро читая файл, показывая это в прогресбаре, но в режиме Release программа намертво зависает даже при чтении 1 строки.

Интересные наблюдения:
При зависании в режиме Release программа нагружает процессор как будто уходя в какой-то цикл.

Как решить данную проблему не имею ни малейшего понятия да и вообще интересно по какой причине это может происходить.

Добавлено через 34 минуты
Новые данные по работе приложения!!!

На остальных компьютерах кроме моего в одинаковых условиях в плане антивирусов Release версия работает идеально!!!!

Я действительно без понятия что на моём компьютере идёт не так!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.05.2020, 19:33
Ответы с готовыми решениями:

Программа виснет при чтении ответа TcpClient
Есть программа, суть заключается в том, что она должна отправить запрос и получить ответ. private void button1_Click(object sender,...

Шифр Виженера - программа вылетает при чтении из файла
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; namespace...

Зависает программа при чтении из файла
За код прошу сильно не пинать)Черновой пока вариант) unit Unit1; interface uses Windows, Messages, SysUtils, Variants,...

8
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
09.05.2020, 19:52
Цитата Сообщение от astral0pitek Посмотреть сообщение
s = k + i * (NzINF + 1) + j * (NzINF + 1) * (NyINF + 1);
Проверь значения s в этой сроке. Должны быть меньше, чем NxyzINF + 1.

Добавлено через 1 минуту
И правильно ли там, вообще, написано? Может где-то должен быть и NxINF?
0
0 / 0 / 0
Регистрация: 06.05.2020
Сообщений: 18
09.05.2020, 20:17  [ТС]
Вылетело исключение

Сообщение ошибкиSystem.Reflection.TargetInvocationExcept ion: Адресат вызова создал исключение. ---> System.FormatException: Входная строка имела неверный формат.
в System.Number.ParseDouble(String value, NumberStyles options, NumberFormatInfo numfmt)
в InjectionlineCLR.Class_Create.PreProcess or_Inflector_ElectricField(String path, DataGridView datagrid, ToolStripProgressBar statusbar, ToolStripLabel statuslable) в C:\Users\victo\source\repos\Injection_li ne_CLR\Injection_line_CLR\Class_Create.h :строка 109
--- Конец трассировки внутреннего стека исключений ---
в System.RuntimeMethodHandle.InvokeMethod( Object target, Object[] arguments, Signature sig, Boolean constructor)
в System.Reflection.RuntimeMethodInfo.Unsa feInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
в System.Reflection.RuntimeMethodInfo.Invo ke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
в InjectionlineCLR.Main.button_create_Clic k(Object sender, EventArgs e) в C:\Users\victo\source\repos\Injection_li ne_CLR\Injection_line_CLR\Main.h:строка 898
в System.Windows.Forms.Control.OnClick(Eve ntArgs e)
в System.Windows.Forms.Button.OnClick(Even tArgs e)
в System.Windows.Forms.Button.OnMouseUp(Mo useEventArgs mevent)
в System.Windows.Forms.Control.WmMouseUp(M essage& m, MouseButtons button, Int32 clicks)
в System.Windows.Forms.Control.WndProc(Mes sage& m)
в System.Windows.Forms.ButtonBase.WndProc( Message& m)
в System.Windows.Forms.Button.WndProc(Mess age& m)
в System.Windows.Forms.NativeWindow.Callba ck(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)


Эта ошибка появляется при первом выполнении кода но если нажать продолжить всё выполняется.

После закрытия и открытия программы ошибка повторяется снова.

Добавлено через 17 минут
Цитата Сообщение от nd2 Посмотреть сообщение
Проверь значения s в этой сроке. Должны быть меньше, чем NxyzINF + 1.
Да, число получается меньше. В s - 8120600, в NxyzINF - 8120601
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
09.05.2020, 20:23
Цитата Сообщение от astral0pitek Посмотреть сообщение
Да, число получается меньше.
Во всё время работы цикла while()? Как проверял?
0
0 / 0 / 0
Регистрация: 06.05.2020
Сообщений: 18
09.05.2020, 20:24  [ТС]
Цитата Сообщение от nd2 Посмотреть сообщение
И правильно ли там, вообще, написано? Может где-то должен быть и NxINF?
Уже пробовал. Но опять же в Debug работает, а в Release нет.

Добавлено через 16 секунд
Цитата Сообщение от nd2 Посмотреть сообщение
И правильно ли там, вообще, написано? Может где-то должен быть и NxINF?
Уже пробовал. Но опять же в Debug работает, а в Release нет.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
09.05.2020, 20:28
Цитата Сообщение от astral0pitek Посмотреть сообщение
Уже пробовал.
Что значит пробовал? Ты не знаешь, как там должно быть написано?
0
0 / 0 / 0
Регистрация: 06.05.2020
Сообщений: 18
09.05.2020, 20:55  [ТС]
Цитата Сообщение от nd2 Посмотреть сообщение
Что значит пробовал? Ты не знаешь, как там должно быть написано?
Как должно быть написано знаю. Отчаяние когда просидел сутки над проблемой заставляет меня пробовать вообще всё что придёт в голову. Кстати я сейчас вроде бы починил проект. Провожу последние тесты в настройках для того чтобы написать моё решение.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
09.05.2020, 20:59
На это бы ответил:
Цитата Сообщение от nd2 Посмотреть сообщение
Во всё время работы цикла while()? Как проверял?
Знаешь, что такое UB?

Добавлено через 1 минуту
Цитата Сообщение от astral0pitek Посмотреть сообщение
C++
1
Application::DoEvents();
Вот это рекомендуется не применять. Из-за этого тоже могут непонятки возникать.
https://www.cyberforum.ru/blog... g4909.html
Лучше закинь свой код в отдельный поток.
1
0 / 0 / 0
Регистрация: 06.05.2020
Сообщений: 18
09.05.2020, 21:16  [ТС]
Цитата Сообщение от nd2 Посмотреть сообщение
Знаешь, что такое UB?
К сожалению нет

Цитата Сообщение от nd2 Посмотреть сообщение
Вот это рекомендуется не применять. Из-за этого тоже могут непонятки возникать.
https://www.cyberforum.ru/blog... g4909.html
Лучше закинь свой код в отдельный поток.
Да, я прекрасно понимаю что надо бы закинуть всё в отдельный поток но времени нету. После магистерской я обязательно всё переведу в отдельный поток.

Добавлено через 10 минут
Вот моё решение проблемы:

Первое у меня с какого-то фига стояло в "Проект->Свойства->Свойства конфигурации->Дополнительно->Использовать отладочные библиотеки" стояло "Да". После отключения стали лететь постоянные ошибки совсем не связанные с основной проблемой на любых компьютерах (что как-то странно), но в Debug по прежнему всё хорошо.

Вторая часть решения проблемы заключалась в полном отключении символов отладки и удаление всего кэша который у меня накопился. Стали лететь ошибки в дебаге как раз идентичные той о которой я писал в сообщении сообщении выше, что привело меня на мысль поменять конвертацию.
Было:
C++
1
2
3
EXINF[s] = double::Parse(EXYZINF[0]);
        EYINF[s] = double::Parse(EXYZINF[1]);
        EZINF[s] = double::Parse(EXYZINF[2]);
Стало:
C++
1
2
3
EXINF[s] = Convert::ToDouble(EXYZINF[0]);
    EYINF[s] = Convert::ToDouble(EXYZINF[1]);
    EZINF[s] = Convert::ToDouble(EXYZINF[2]);
После чего ошибок как не бывало и Release версия стала работать везде.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.05.2020, 21:16
Помогаю со студенческими работами здесь

При чтении файла программа выводит бессмыслицу
Доброго времени суток! Уважаемые участники форума, возникла следующая проблема. Код, который привожу ниже, при запуске должен открыть и...

TCPClient виснет при чтении ответа
Приветствую. Есть что-то непонятное мне в работе программы, суть такая, программа шлет команду по TCP-IP и по идее должна получить ответ,...

UDP при чтении пакетов виснет форма
Пытаюсь принять пакет, но при выполнении форма виснет. Пробовал ответ запихать в таймер, но тоже самое получилось. В чем проблема то? ...

Windows виснет при чтении / записи DVD
Здравствуйте. Давно уже мачаюсь с этой проблемой, даже не помню с чего она началась и когда, просто смирился и все, но сейчас захотелось...

"Нарушение прав доступа при чтении по адресу" при чтении структур из бинарного файла
Пытаюсь разобраться со структурами в бинарных файлах. Допустим, есть массив структур. Записываю его в бинарный файл (закомментированный...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru