|
0 / 0 / 0
Регистрация: 30.05.2014
Сообщений: 32
|
|||||||||||||||||||||
PLINQ: Читать файл, каждую строку преобразовывать и записывать преобразованную строку в другой файл13.04.2015, 18:47. Показов 1508. Ответов 11
Метки нет (Все метки)
есть простая задача: читать файл, каждую строку преобразовывать и записывать преобразованную строку в другой файл. строки достаточно мудреные и на их конвертацию тратится прилично процессорных ресурсов. дабы разложить задачу по ядрам, решил ее распараллелить. для этого операцию конвертации объединил с выводом в файл и оформил в виде единственного метода. соорудил буфер-список, в который вычитываются строки из входного файла, по мере заполнения которого, выполняется вышеозначенный метод.
в общем, получилось вот так:
0
|
|||||||||||||||||||||
| 13.04.2015, 18:47 | |
|
Ответы с готовыми решениями:
11
Читать большой файл байтами и записывать в другой Как скопировать строку c одного файла и вставить в другой файл эту же строку с символом в конце “_” |
|
0 / 0 / 0
Регистрация: 30.05.2014
Сообщений: 32
|
|
| 13.04.2015, 18:55 [ТС] | |
|
ну, вообще-то, да. около 2 гиг. в результате преобразований получаются файлы 5 гиг. кол-во строк - 7-8 млн.
Добавлено через 1 минуту просто я попробовал распараллелить, и у меня получилось время обработки такого файла сократить вдвое - 22 минуты против 45. размер буфера я взял 16 (при 24-ядерной конфигурации хоста). т.е. результат обнадеживающий. но возникло дополнительное требование клиента: порядок строк должен сохраняться. вот и ломаю голову..
0
|
|
|
Master of Orion
|
||||||
| 13.04.2015, 19:11 | ||||||
|
Держите класс:
Буффер лучше читать большими кусками, по 128мб хотя бы. Причем считали, отдали на обработку, а сами подгружаем дальше, то есть не блокирующе ждем, пока там нам обработают, а FireAndForget. То есть один поток читает и кормит данными метод, метод высчитывает всё, после чего уже третий поток записывает всё в результирующий файл. Конвеерная обработка такая. Первый метод возвращает новый массив, второй метод "грязный" - портит массив, который ему передали, зато работает быстрее, а главное требует в 2 раза меньше памяти. Добавлено через 7 минут Ну а что касается порядка, нужно читать спеку, тогда не будете удивляться: https://msdn.microsoft.com/ru-... 10%29.aspx Operator ForAll<TSource> Result when the source sequence is ordered Executes nondeterministically in parallel Result when the source sequence is unordered Executes nondeterministically in parallel
1
|
||||||
|
0 / 0 / 0
Регистрация: 30.05.2014
Сообщений: 32
|
|||||||||||
| 13.04.2015, 20:04 [ТС] | |||||||||||
|
написал ответ, но он куда-то подевался. попробую еще раз.
спасибо за ответ. с кодом буду разбираться. два момента. первый: под буфером (в контексте моей задачи) я подразумевал список строк. через AsParallel().ForAll() я хотел добиться одновременного (по возможности) выполнения операций над всеми (также по возможности) строками. поэтому нет смысла делать буфер слишком большим – не больше числа ядер в системе. и даже меньше. по наблюдениям задача работает быстрее с размером буфера 16 на 24-ядерном хосте, чем с размером буфера 24. второй момент: наверное, я чуток подразобрался с AsOrdered() и изменил код так:
Добавлено через 4 минуты только что проверил. падение производительности не катастрофическое - 23 минуты против 22. можно жить!
0
|
|||||||||||
|
Master of Orion
|
|
| 13.04.2015, 20:46 | |
|
blackofe, еще раз: читаете массив строк, используете PartitionedParallelMapDirty, записываете получившийся строковый массив в файл, всё! Это в разы быстрее AsParallel...
Хотя конечно, если вы фанат LINQ и вам важен сам факт его использования, то AsParallel без конкурентов. Добавлено через 3 минуты Неужели вам не любопытно? Возьмите размер буфера 65536 элементов, попробуйте на нем метод, который я предложил выше, и выложите тест производительности.
1
|
|
|
0 / 0 / 0
Регистрация: 30.05.2014
Сообщений: 32
|
||||||||||||||||
| 14.04.2015, 16:18 [ТС] | ||||||||||||||||
|
попробую обязательно. просто хотелось и самому разобраться.
Добавлено через 16 часов 59 минут попробовал использовать предложенный метод ArrayPerformanceHelper.PartitionedParall elMap (до dirty-версии пока не добрался). на небольших файлах (порядка 250 тыс. строк) он показал вполне ощутимый прирост производительности. файл, который AsParallel разбирал за 45 секунд, PartitionedParallelMap обработал за 35. но когда дело дошло до реальных файлов, он пасонул. на сервере с 24 ядрами и 48 гигами оперативки я получил следующие результаты: AsParallel() без сохранения порядка:
но за пример спасибо. возможно, в других случаях пригодится.
0
|
||||||||||||||||
|
0 / 0 / 0
Регистрация: 30.05.2014
Сообщений: 32
|
|
| 14.04.2015, 16:50 [ТС] | |
|
я как раз собираюсь попробовать "грязный" метод. буфер делал меньше, но на небольших файлах. в общем, в процессе.
0
|
|
|
0 / 0 / 0
Регистрация: 30.05.2014
Сообщений: 32
|
|||||||||||
| 15.04.2015, 20:42 [ТС] | |||||||||||
|
докладываю. протестировал "грязный" метод. производительность показывает лучше, чем "чистый":
0
|
|||||||||||
|
Master of Orion
|
|
| 15.04.2015, 20:52 | |
|
blackofe, ну, это очень странно, AsParallel по идее не может быть быстрее, т.к. базируется на тех же примитивах, только еще и больше ресурсов тратит, было даже целое исследование на эту тему. ИМХО как-то что-то не так делаете
0
|
|
|
0 / 0 / 0
Регистрация: 30.05.2014
Сообщений: 32
|
|
| 15.04.2015, 22:36 [ТС] | |
|
возможно не так. к примеру, в реализации с AsParallel я реюзаю буфер. а в случае с ArrayPerformanceHelper я каждый раз набиваю буфер заново, причем каждую строку снабжаю своим конвертором, чтобы избежать "наводок". так что сравнение нечестное. по хорошему, надо было бы во-первых, сделать конвертор статическим (по идее это можно было бы сделать), а во-вторых, реюзать буфер. тогда, наверняка ArrayPerformanceHelper показал бы результат лучше, чем AsParallel.
если дойдут руки, попробую это реализовать.
0
|
|
| 15.04.2015, 22:36 | |
|
Помогаю со студенческими работами здесь
12
Как записывать в файл на новую строку? Вывести строку, содержащую эти же слова, но расположенные в обратном порядке. Записать полученную строку в другой файл Не работает код (программа считывает из файла строку, убирает лишние пробелы и записывает в другой файл строку, словами наоборот) Как читать строку из .ini файла?
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|