|
0 / 0 / 0
Регистрация: 23.08.2020
Сообщений: 47
|
|||||||||||||||||||||
Передача значения метода цикла в другой метод и возврат обратно в цикл24.11.2020, 18:51. Показов 4830. Ответов 42
Метки нет (Все метки)
Добрый день, есть практическая задача: осуществлять считывание большого (десятки млн строк) текстового файла, выполнять математические фиксированные операции над числами строки и записывать их в новый файл. Хочу для нормального оформления кода выводить отельные операции в отдельные методы и столкнулся с проблемой решения некоторых задач. Далее для простоты приведены примеры (несмотря на то что делается в WinForms, тут идут сугубо темы наследования переменных из метода-в-метод
Вопрос собственно как осуществлять передачу строки
P.S. Знаю что операции будут идти долго на 1 потоке, хочу начать вводить многопоточность - чтение/запись части файла в отдельные файлы и потом объединение итогового, а для этого (и вообще для саморазвития) - оформлять функции в отдельные методы
0
|
|||||||||||||||||||||
| 24.11.2020, 18:51 | |
|
Ответы с готовыми решениями:
42
Передача двумерного массива из одного метода в другой метод
|
|
0 / 0 / 0
Регистрация: 23.08.2020
Сообщений: 47
|
|
| 25.11.2020, 00:32 [ТС] | |
|
Оуфффф, как сложно
![]() Тогда пожалуй лучше сделаю потоковые вычисления, а записи в рамках одной операции; Где кстати лучше почитать о корректной работе такой? Чтобы не понаступать на грабли
0
|
|
|
Злой няш
2136 / 1505 / 565
Регистрация: 05.04.2010
Сообщений: 2,881
|
|
| 25.11.2020, 00:43 | |
|
CLR via C#, Джеффри Рихтер, Глава 28. Асинхронные операции ввода-вывода. Или всю 5 часть.
1
|
|
|
619 / 399 / 187
Регистрация: 28.11.2019
Сообщений: 867
|
|
| 25.11.2020, 00:47 | |
|
Georg Keneberg, потокобезопасные коллекции - https://docs.microsoft.com/ru-... concurrent. Насчет синхронизации - можно начать тут https://metanit.com/sharp/tutorial/11.4.php, почитать про все способы синхронизации. Правда на метаните не про все рассказано, к примеру, есть такая полезная штука как барьер https://docs.microsoft.com/ru-... ng/barrier. Если соберетесь многопоточно писать/читать файлы, синхронизировать доступ в любом случае придется.
Добавлено через 2 минуты ReaderWriterLock и ReaderWriterLockSlim тоже пригодится https://docs.microsoft.com/ru-... writerlock
1
|
|
|
Модератор
|
|||
| 25.11.2020, 00:53 | |||
|
У вас же не какой-то супер сервер с множественным Raid массовом. Поток чтения с накопителя только один. И дербанить его между разными потоками - только замедлит его работу. Единственное из-за чего может тормозить программа - это забивка ОЗУ мусором. Что неявно приводит к активному использованию накопителя несколькими потоками. При большом количестве string быстро забивает память. Причины этого вам уже выше объяснили. Поэтому желательно избавиться от него. Избавляться надо начинать с формата файлов. Если вам надо сохранить текстовый формат, то лучше использовать ASCII. Это позволит отказать и от string, и от char. И перейти на обработку байтов. Лучший же вариант, если вам не нужен текстовый формат и вы можете использовать BinaryWriter и BinaryReader. Это позволит полностью исключить string сильно разгрузит память. Добавлено через 1 минуту Это почти мгновенные операции. Потоки ни чего не ускорят, только добавят геморроя.
2
|
|||
|
619 / 399 / 187
Регистрация: 28.11.2019
Сообщений: 867
|
|
| 25.11.2020, 02:17 | |
|
Еще зависит от диска. У меня есть довольно старенький обычный hdd, который рассчитан на подобную работу, оптимизирован для многопоточной записи видеопотоков, правда хорошо подобные hdd справляются только с командами одного типа - либо чтение, либо запись, одновременно и то, и другое не очень. В hdd зависит от количества блинов, головок, скорости вращения, прошивки, размера кэша. В ssd от кэша, типа контроллера и прошивки, типа памяти, впрочем даже дешевые ssd нормально разгребают большую глубину очереди. А так в общем-то те же торренты пишут данные в многопотоке и даже на медленных hdd вполне нормально работают. Правда и диск могут нагрузить по полной. Надо ли писать в многопоток или не надо это уже стоит подумать, например если программа будет распространяться, то юзеры с медленными дисками могут удивиться, что при работе программы у них появляются тормоза, особенно если диск параллельно используется системой или чем-то еще. Если для себя - то прикинуть, стоит ли с этим заморачиваться, одно дело торренты с гигабайтами данных и другое дело текстовый файлик записать.
0
|
|
|
Модератор
|
||
| 25.11.2020, 11:45 | ||
|
Много поточное обращение к накопителю применяется там где нужны одновременно (для одного или разных приложений) разные файлы или разные участки одного файла. В данном же случае нужно обработать полностью один файл. А для такой операции на любом накопителе разбивка на отдельные потоки даст только ухудшение. И ухудшение, скорее всего, в разы.
0
|
||
|
619 / 399 / 187
Регистрация: 28.11.2019
Сообщений: 867
|
||
| 25.11.2020, 15:36 | ||
|
0
|
||
|
0 / 0 / 0
Регистрация: 23.08.2020
Сообщений: 47
|
|||||||||||
| 25.11.2020, 17:05 [ТС] | |||||||||||
|
Справедливости ради стоит отметить что млн строк это уже вчерашний день, технологии так ускакали вперед что уже есть и млрд. строк [речь, правда, об эквивалентном размере строк - так как такие большие данные лежат в бинарных файлах] - много "избыточных" данных, которые чисто технически нереально загрузить ни в одно ПО для работы (там нужны операции "умного прореживания" - алгоритмы есть, но работают с частью данных, как ни крути, выдавая уже вменяемое число точек)
Вообще, прямой пересчет координат это вынужденная мера, так как есть форматы которые позволяют задавать трансформацию начала координат (то есть просто записывается матрица 4х4, хранящая 9 нелинейных функций от трех Эйлеровых углов поворота и 3 смещения (dX, dY, dZ) либо вовсе прямое описание проекции системы координат) ____ Я вот хотел попробовать оптимизировать код, считывая фрагменты файла, так как попытавшись считать и перевести файл с 23 млн точек (680 Мб) он за 10 секунд забивал по 3 Гб памяти и падал с сигналом что-то с System.OutOfMemoryException Итак - начало стандартное:
Нашел тут интересное решение (?) но пока в силу слабого понимания языка не пойму о чем речь. Раньше бы делал делая массив строк File.ReadAllLines - но хотел бы уйти от этого теперь... а как по другому не пойму
0
|
|||||||||||
|
Модератор
|
||
| 25.11.2020, 17:08 | ||
|
Любой накопитель - это последовательное устройство. В накопителе не существует файлов. Эта сущность более высокого порядка. И для переключения для доступа к различным участкам (без разницы одного файла или нескольких) требуется дополнительное время. Для некоторых дисков эти затраты меньше, для других больше, но они всегда есть. Для большинства накопителей произвольный доступ многократно затратнее последовательного. Мультидоступ применяется не для ускорения - он всегда медленнее. Он нужен для возможности параллельно работать с накопителем нескольким приложениям. При этом каждое из них будет работать медленнее. Проблемы здесь именно физического характера и программным путём ничего не решишь.
0
|
||
|
619 / 399 / 187
Регистрация: 28.11.2019
Сообщений: 867
|
|||||||
| 25.11.2020, 17:50 | |||||||
|
Georg Keneberg, вам не нужно два стрингбилдера. И зачем кстати вы два раза читаете файл. Как вариант:
Добавлено через 4 минуты
0
|
|||||||
|
619 / 399 / 187
Регистрация: 28.11.2019
Сообщений: 867
|
||
| 25.11.2020, 19:18 | ||
|
0
|
||
|
0 / 0 / 0
Регистрация: 23.08.2020
Сообщений: 47
|
|||||||
| 25.11.2020, 22:23 [ТС] | |||||||
![]() Единственное, по сравнению с вашим я явно указал на массив lineData, чтобы иметь возможность передать явно этот элемент в модуль расчета - но такое впечатление что операции вообще не идут
Но что-то не так, мысли теряются что именно, потому что при отладке VS выводит следующее: Помощник по отладке управляемого кода "ContextSwitchDeadlock" : "CLR не удалось перейти из COM-контекста 0x12467a8 в COM-контекст 0x12466f0 за 60 секунд. Наиболее вероятно, что поток, владеющий контекстом/апартаментом назначения, находится в режиме ожидания или выполнения очень длительной операции без прокачки сообщений Windows. Обычно эта ситуация отрицательно влияет на производительность и даже может привести к зависанию приложения или чрезмерному расходованию памяти. Чтобы избежать этой проблемы, все потоки однопоточного апартамента (STA) должны использовать примитивы ожидания для прокачки (например, CoWaitForMultipleHandles) и периодически прокачивать сообщения во время длительных операций."
0
|
|||||||
|
619 / 399 / 187
Регистрация: 28.11.2019
Сообщений: 867
|
|
| 25.11.2020, 22:59 | |
|
Georg Keneberg, ContextSwitchDeadlock не обязательно означает, что есть проблемы, при длительных операциях студия вас просто предупреждает, что возможно что-то не так. Можно либо отключить, либо игнорировать. Но вот что все зависает это действительно не очень хорошо. Вопрос кстати, а зачем вы в метод передаете стрингбилдер, сделайте его просто полем класса, в метод передавайте только данные. Еще покажите пожалуйста реализацию метода WriteToPTS. И за раз миллион строк это все-таки многовато на мой взгляд. Проблема еще может быть уже в самих методах расчета.
Добавлено через 15 минут И кстати посмотрите в сторону async/await https://metanit.com/sharp/tutorial/13.3.php
0
|
|
|
0 / 0 / 0
Регистрация: 23.08.2020
Сообщений: 47
|
||||||||||||||||
| 25.11.2020, 23:40 [ТС] | ||||||||||||||||
|
Методика применявшаяся ранее (с одним StringBuilder) по скорости выглядит примерно так (если ставить counter = 500):
См. вложение Я решил вернуться к истокам - с двумя StringBuilder, с ним хоть не было фатального падения скорости на перепрыгивании с операции чтения файла на расчет (а вот тут может все таки и стоит делать это в двух поточном режиме? когда 1 поток будет постоянно только читать файл, а другой - только считать и заносить в Builder?) 1. Запускаем процедуру чтения файла:
0
|
||||||||||||||||
|
0 / 0 / 0
Регистрация: 23.08.2020
Сообщений: 47
|
||||||
| 26.11.2020, 00:15 [ТС] | ||||||
|
P.S.
Решил проблему обрабатывая механику разделения строки на double (Split (' ')) в теле расчетного метода.
Запустил на 680 Мб файле - обработалось минуты за 3. Меня это полностью устраивает пока что, ресурсов не потребляется особо. (см. вложение) Спасибо всем!!! Пойду изучать запись сразу в бинарные файлы (формат облака точек типа .e57 к примеру...)
0
|
||||||
|
Модератор
|
|||
| 26.11.2020, 00:24 | |||
|
И такие задачи часто встречаются. Вычислительные возможности современных процессоров и современных SSD отличаются в сотни раз. Не спорю, что задачи в которых узким местом является производительность процессора встречаются. Но в границах данного раздела - мне такие темы встречались очень редко - раз-два за год.. В задаче же из этой темы требуется простейшее преобразование координат. И издержки этого преобразования по сравнению с обращением к накопителю будут близки к нулю. Конкретно эта задача будет упираться именно в оптимизацию работы с накопителем и ОЗУ. Добавлено через 2 минуты
0
|
|||
|
0 / 0 / 0
Регистрация: 23.08.2020
Сообщений: 47
|
|
| 26.11.2020, 00:31 [ТС] | |
|
0
|
|
|
619 / 399 / 187
Регистрация: 28.11.2019
Сообщений: 867
|
||||||||||||||||||
| 26.11.2020, 03:18 | ||||||||||||||||||
Имелось ввиду разумное использование.Georg Keneberg, попробуйте вместо
1
|
||||||||||||||||||
|
Модератор
|
||
| 26.11.2020, 11:17 | ||
|
И подобных задач встречается очень много: перерасчёт больших данных из одного файла в другой. А для подобных задач большая вычислительная нагрузка, как в данной, как раз таки не характерна.
0
|
||
| 26.11.2020, 11:17 | |
|
Передача переменной в функцию и возврат обратно
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
|
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения:
- добавлена многоязычность
- добавлено снятие скриншотов
- добавлено поддержание бафов хождения по воде (для жреца, дк и шамана)
- и так, по. . .
|
Алиса нашла кучу ошибок компиляции и запуска в проекте, который без проблем компилировался и запускался)))
anaschu 30.06.2026
Я пока посмеюся, но завтра проверю. А вообще интерсно. Дал алисе файл, в котором точно нет ошибок компиляции и запуска, и попросил их найти. Нашла кучу)))
Критические ошибки, мешающие компиляции и. . .
|
сукцессия 16. Общий обзор, в основном что бы другие ии поняли
anaschu 29.06.2026
# Передаточный документ: модель микоризной сукцессии (для нового чата)
Этот документ предназначен для того, чтобы новый чат Claude мог продолжить
работу без необходимости заново разбираться в. . .
|
|
сукцессия 15 неявная схема
anaschu 29.06.2026
Алиса
Калибровка параметров симбиотической модели: технический обзор
Содержание:
Введение
Постановка проблемы
Технические аспекты реализации
Процесс внедрения изменений
|
сукцессия 14. Обновленная схема модели
anaschu 28.06.2026
ГЛОБАЛЬНАЯ ОПИСАТЕЛЬНАЯ СПЕЦИФИКАЦИЯ ЭКОСИСТЕМНОЙ МОДЕЛИ «SOIL CHEMISTRY & MYCORRHIZA 2. 0»
https:/ / ibb. co/ NnkGpfMd
Представленная интегрированная схема описывает непрерывную нелинейную. . .
|
сукцессия 13. Питон модель трехзонного мицелия, пока что в основном арбускулярного
anaschu 28.06.2026
## Разработка агентной модели микоризной сукцессии: от выявления артефактов к созданию комплексной системы
### Аннотация
Представлено исследование по разработке агентной модели микоризной. . .
|
сукцессия 12. краткий список проверок модели перед запуском.
anaschu 27.06.2026
Скрытые отказы в моделях систем динамики (SD-models) экологических систем: два случая из практики
Контекст
Разбирался прототип модели систем динамики (SD-модели) микоризной сукцессии: пять. . .
|