![]() |
Модераторы: Partizan, gambit |
![]() ![]() ![]() |
|
N1ko |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 383 Регистрация: 30.12.2007 Где: Киев Репутация: нет Всего: нет |
Здравствуйте, меня интересует, возможно ли как то избежать нехватки памяти в этом случае? Записал это всё дело в текстовый документ - в результате он занял около 600 мб.
Когда же записываю в словарь - не доходит даже до 30000000 итерации и ругается на нехватку памяти. Dictionary забирает под себя все 4 гб оперативы, записав по сути всего метров 200 в себя. Как оказалось, он очень прожорлив. Попробовал с List - там дело обстоит гораздо лучше. Как я понимаю в словарях много памяти уходит на хэш private void button1_Click(object sender, EventArgs e) { long i = 0; for (int d = 0; d < 50000000; d++) { string line = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"; dict.Add(i.ToString(), line); i++; } } Зы Не спрашвайте зачем это нужно и не предлагайте использовать какую нибуть СУБД или что то подобное. Меня интересует конкретно этот случай. За ранее всем благодарен. Это сообщение отредактировал(а) N1ko - 26.1.2011, 22:57 |
|||
|
||||
Voyager |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 532 Регистрация: 8.2.2005 Репутация: 3 Всего: 18 |
Нет.
|
|||
|
||||
wester |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 675 Регистрация: 27.2.2009 Репутация: 3 Всего: 13 |
N1ko,
загружать мелкими кусками и обрабатывать словарь нельзя ? если загружать мелкими порциями, то с течением времени CLR даст пинок сборщику мусору, и тот будет убирать неиспользуемые ссылки. по крайней мере так думаю) |
|||
|
||||
N1ko |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 383 Регистрация: 30.12.2007 Где: Киев Репутация: нет Всего: нет |
Да не, меня как раз интересует загрузка целого куска данных и сразу. Пробовал я принудительно GC запускать, таймауты даже пробовал ставить (вот так извращался =)). Всё равно не помогает.
|
|||
|
||||
jonie |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 6 Всего: 118 |
не верю. в x86 в винде приложению доступно только два гига.
ну вы и сравнили... используйте x64, если не можете нормально алгоритм сделать обработки. -------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
N1ko |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 383 Регистрация: 30.12.2007 Где: Киев Репутация: нет Всего: нет |
Хм... А можно подробнее про алгоритм обработки? Можно сделать что то более эффективное в данном случае?
Поправка - в винде x86 доступно почти 3.18 гб. Вот их все и заюзало. Это сообщение отредактировал(а) N1ko - 27.1.2011, 12:49 |
|||
|
||||
jonie |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 6 Всего: 118 |
N1ko,
кто вам так безбожно наврал-то? Это еритики! Почитайте про устройство вирт памяти в винде (например в книжках по программированию драйверов). И "то что доступно самой винде" != "доступно моему приложению".
-------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
||||
|
|||||
Экскалупатор |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1746 Регистрация: 1.4.2009 Где: г. Минск Репутация: 5 Всего: 24 |
N1ko, а чем обусловлено то что данные нужно загружать все?
|
|||
|
||||
MefistoJ |
|
|||
хз Профиль Группа: Участник Сообщений: 8 Регистрация: 21.2.2009 Репутация: нет Всего: нет |
В словаре не может находиться элементов больше чем Int32.MaxValue.Конструктор словаря Dictionary<Key , Value>(int capacity).Так что в один словарь видимо не запихнеш) Это сообщение отредактировал(а) MefistoJ - 28.1.2011, 15:30 |
|||
|
||||
N1ko |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 383 Регистрация: 30.12.2007 Где: Киев Репутация: нет Всего: нет |
int.MaxValue = 2147483647 гораздо больше чем 50000000
|
|||
|
||||
wester |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 675 Регистрация: 27.2.2009 Репутация: 3 Всего: 13 |
||||
|
||||
m0nax |
|
|||
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 24.6.2010 Репутация: нет Всего: нет |
Кроме того что выполняется почти моментально, прекрасно умещается в памяти Только не надо говорить "а я так не хочу" - не хочешь оптимизировать код, но хочешь чтоб все было быстро и хорошо? Ну бред же чеслово... |
|||
|
||||
Экскалупатор |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1746 Регистрация: 1.4.2009 Где: г. Минск Репутация: 5 Всего: 24 |
m0nax, о какой оптимизации ты говоришь? у меня падает исключение о нехватке памяти на первой строке
очевидно двух гигов все же не хватает... |
|||
|
||||
m0nax |
|
|||
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 24.6.2010 Репутация: нет Всего: нет |
Экскалупатор, ну у меня самого 2.5 гига, на выполнение хватило всего одного
А вариант из первого поста вываливался с исключением про нехватку памяти... В любом случае тут ключевой момент в new Dictionary<int, string>(50000000); Без этого словарю приходится выделать память под новые элементы по мере их добавления и копировать туда существующие данные(а старая память становится мусором) Это сообщение отредактировал(а) m0nax - 31.1.2011, 16:01 |
|||
|
||||
Экскалупатор |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1746 Регистрация: 1.4.2009 Где: г. Минск Репутация: 5 Всего: 24 |
m0nax, это понятно. но памяти при этом тоже не хватает. да и к тому же тут есть небольшая нестыковка. в первом посте сказано что строки читаются из файла, а по сему их будет не одна(как в твоем примере) а 50000000. так что это очевидно не спасет.
|
|||
|
||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | .NET для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |