![]() |
Модераторы: Partizan, gambit |
![]() ![]() ![]() |
|
Bladerender |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 207 Регистрация: 19.7.2007 Репутация: нет Всего: нет |
Помогите пожалуйста. Опытным путем было вычислено, что память девается именно при использовании паралелизма.
Код имеет такой вид. GetSubTextInformation() - тут находится парсер, который парсит текстовую информацию и возвращает уже готовый результат. Получается, что память уходит в никуда и такими обьемами что просто ужасть. Parallel.For(0, textParts.Count, delegate(int i) { article[i] = parse.GetSubTextInformation(textParts[i], _textId, i + 1); }); При замене на просто for все становится как надо, никто никуда не ищезает, все очищается, и прога при роботе не превышает в памяти размера в 25 метров. Если с паралельностью то доходит до гига и потом каюк. Слышал что для каждого потока создается как бы своя куча, (я думаю там мусор и накапливается). Но немогу понять как это сделать. пробовал: Parallel.For(0, textParts.Count, delegate(int i) { using(Article article = parse.GetSubTextInformation(textParts[i], _textId, i + 1)) article[i] = article; }); все рано галяк. Пробовал так же внутри цыкла вызывать GC.Collect() но все равно безрезультатно. Помогите. |
|||
|
||||
marcusmae |
|
|||
![]() stravaganza ![]() ![]() Профиль Группа: Участник Сообщений: 874 Регистрация: 26.3.2006 Репутация: 22 Всего: 39 |
Bladerender, похоже, что память съедают не фигурные скобочки, так что без кода парсера тут нечего сказать.
-------------------- ἀπὸ μηχανῆς θεός |
|||
|
||||
Bladerender |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 207 Регистрация: 19.7.2007 Репутация: нет Всего: нет |
Код парсера возвращает коллекцию строк.
Тоесть класс, обьект которого возвращается имеет вид типа: class Name { public string Name; public List<string> collection = new List<string>(); } |
|||
|
||||
marcusmae |
|
|||
![]() stravaganza ![]() ![]() Профиль Группа: Участник Сообщений: 874 Регистрация: 26.3.2006 Репутация: 22 Всего: 39 |
Bladerender, вероятно, какая-то проблема с разделяемостью ресурсов или thread-safety. Кстати, вместо String-массива пользуйтесь StringBuilder, когда создаёте строку. Это - общие соображения. А конкретно я бы попробовал-таки разделить ресурсы, то есть либо сделать парсер статическим, либо создать его экземпляров по числу вычислительных потоков и поставить в Parallel.Do. С другой стороны покрутите и свой вариант - всегда же можно вместо некоторых кусков кода наставить временных заглушек и тем самым локализовать проблему.
-------------------- ἀπὸ μηχανῆς θεός |
|||
|
||||
Bladerender |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 207 Регистрация: 19.7.2007 Репутация: нет Всего: нет |
Делал статическим, один перец. Нащет Parallel.Do, то пока не пробовал, но думаю что это все равно ничего не даст, так как потоки сами создают в Parallel.For по екземпляру на поток. Я в этьм почти уверен.
|
|||
|
||||
rubbiroid |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 23.8.2006 Где: Германия Репутация: нет Всего: 1 |
Не знаю, может поможет. Если у тебя внутри потока есть цикл, в котором создаются объекты - то сборщик мусора "старые" объекты удалит только после выхода из цикла. У меня такое было на загрузке фоток - вплоть до вываливания в нехватку памяти (когда более 2 гигабайт съедало). Мне помогло собственноручное удаление объктов внутри цикла.
Это сообщение отредактировал(а) rubbiroid - 26.3.2008, 01:23 |
|||
|
||||
marcusmae |
|
||||
![]() stravaganza ![]() ![]() Профиль Группа: Участник Сообщений: 874 Регистрация: 26.3.2006 Репутация: 22 Всего: 39 |
Bladerender,
окей, я для примеру написал генератор строк
и параллельно-последовательный тест с ним :
И ничего, апокалипсиса не наступило : в обоих случаях пик памяти - примерно 55 мб. Я может, поскромничал, нужны более агрессивные условия? ![]() Присоединённый файл ( Кол-во скачиваний: 2 ) ![]() -------------------- ἀπὸ μηχανῆς θεός |
||||
|
|||||
Bladerender |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 207 Регистрация: 19.7.2007 Репутация: нет Всего: нет |
Странно как-то получается. У меня Ваш код тоже работает нормально. Без апокалипсиса. Я разберусь что не так и вкину свой генератор.
|
|||
|
||||
marcusmae |
|
|||
![]() stravaganza ![]() ![]() Профиль Группа: Участник Сообщений: 874 Регистрация: 26.3.2006 Репутация: 22 Всего: 39 |
Зачем же сразу выкидывать?! = Дайте его потестить, что ли... -------------------- ἀπὸ μηχανῆς θεός |
|||
|
||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |