Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Переполнение Dictionary 
:(
    Опции темы
N1ko
Дата 26.1.2011, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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
PM MAIL ICQ   Вверх
Voyager
Дата 26.1.2011, 23:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 532
Регистрация: 8.2.2005

Репутация: 3
Всего: 18



Нет.
PM   Вверх
wester
Дата 27.1.2011, 01:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 675
Регистрация: 27.2.2009

Репутация: 3
Всего: 13



N1ko
загружать мелкими кусками и обрабатывать словарь нельзя ? 

если загружать мелкими порциями, то с течением времени CLR даст пинок сборщику мусору, и тот будет убирать неиспользуемые ссылки.
по крайней мере так думаю)
PM MAIL   Вверх
N1ko
Дата 27.1.2011, 01:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 383
Регистрация: 30.12.2007
Где: Киев

Репутация: нет
Всего: нет



Да не, меня как раз интересует загрузка целого куска данных и сразу. Пробовал я принудительно GC запускать, таймауты даже пробовал ставить (вот так извращался =)). Всё равно не помогает. 
PM MAIL ICQ   Вверх
jonie
Дата 27.1.2011, 08:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 6
Всего: 118



Цитата(N1ko @  26.1.2011,  22:39 Найти цитируемый пост)
Dictionary забирает под себя все 4 гб оперативы,

не верю. в x86 в винде приложению доступно только два гига.

Цитата(N1ko @  26.1.2011,  22:39 Найти цитируемый пост)
Как оказалось, он очень прожорлив. Попробовал с List - там дело обстоит гораздо лучше.

ну вы и сравнили...


используйте x64, если не можете нормально алгоритм сделать обработки.


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
N1ko
Дата 27.1.2011, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 383
Регистрация: 30.12.2007
Где: Киев

Репутация: нет
Всего: нет



Хм... А можно подробнее про алгоритм обработки? Можно сделать что то более эффективное в данном случае?
Поправка -  в винде x86 доступно почти 3.18 гб. Вот их все и заюзало. 

Это сообщение отредактировал(а) N1ko - 27.1.2011, 12:49
PM MAIL ICQ   Вверх
jonie
Дата 27.1.2011, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 6
Всего: 118



N1ko
Цитата(N1ko @  27.1.2011,  12:48 Найти цитируемый пост)
Поправка -  в винде x86 доступно почти 3.18 гб. Вот их все и заюзало. 

кто вам так безбожно наврал-то? Это еритики! Почитайте про устройство вирт памяти в винде (например в книжках по программированию драйверов). И "то что доступно самой винде" != "доступно моему приложению".

Цитата

Хм... А можно подробнее про алгоритм обработки? Можно сделать что то более эффективное в данном случае?
я не видел как вы обрабатываете данные. Ну если хочется то можно свой Dictionary сделать. Вплоть до unmanaged кода.


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Экскалупатор
Дата 27.1.2011, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 5
Всего: 24



N1ko, а чем обусловлено то что данные нужно загружать все?
PM MAIL ICQ   Вверх
MefistoJ
Дата 28.1.2011, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


хз



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 21.2.2009

Репутация: нет
Всего: нет



Цитата(N1ko @ 26.1.2011,  22:39)
Здравствуйте, меня интересует, возможно ли как то избежать нехватки памяти в этом случае?  Записал это всё дело в текстовый документ - в результате он занял около 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++;
            }
        }

Зы Не спрашвайте зачем это нужно и не предлагайте использовать какую нибуть СУБД или что то подобное. Меня интересует конкретно этот случай.
За ранее всем благодарен.

В словаре не может находиться элементов больше чем Int32.MaxValue.Конструктор словаря Dictionary<Key , Value>(int capacity).Так что в один словарь видимо не запихнеш) 

Это сообщение отредактировал(а) MefistoJ - 28.1.2011, 15:30
PM MAIL ICQ Skype   Вверх
N1ko
Дата 28.1.2011, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 383
Регистрация: 30.12.2007
Где: Киев

Репутация: нет
Всего: нет



int.MaxValue = 2147483647  гораздо больше чем 50000000


PM MAIL ICQ   Вверх
wester
Дата 28.1.2011, 23:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 675
Регистрация: 27.2.2009

Репутация: 3
Всего: 13



PM MAIL   Вверх
m0nax
Дата 31.1.2011, 02:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 24.6.2010

Репутация: нет
Всего: нет



Код

            Dictionary<int, string> dict = new Dictionary<int, string>(50000000);
            int i = 0;
            const string line = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";

            for (int d = 0; d < 50000000; d++)
            {
                dict.Add(i, line);
                i++;
            }

            button2.Text = "ok";

Кроме того что выполняется почти моментально, прекрасно умещается в памяти

Только не надо говорить "а я так не хочу" - не хочешь оптимизировать код, но хочешь чтоб все было быстро и хорошо? 
Ну бред же чеслово...
PM MAIL   Вверх
Экскалупатор
Дата 31.1.2011, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 5
Всего: 24



m0nax, о какой оптимизации ты говоришь? у меня падает исключение о нехватке памяти на первой строке
Код

Dictionary<int, string> dict = new Dictionary<int, string>(50000000);

очевидно двух гигов все же не хватает...
PM MAIL ICQ   Вверх
m0nax
Дата 31.1.2011, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 24.6.2010

Репутация: нет
Всего: нет



Экскалупатор, ну у меня самого 2.5 гига, на выполнение хватило всего одного
А вариант из первого поста вываливался с исключением про нехватку памяти...

В любом случае тут ключевой момент в  new Dictionary<int, string>(50000000);
Без этого словарю приходится выделать память под новые элементы по мере их добавления и копировать туда существующие данные(а старая память становится мусором)

Это сообщение отредактировал(а) m0nax - 31.1.2011, 16:01
PM MAIL   Вверх
Экскалупатор
Дата 31.1.2011, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 5
Всего: 24



m0nax, это понятно. но памяти при этом тоже не хватает. да и к тому же тут есть небольшая нестыковка. в первом посте сказано что строки читаются из файла, а по сему их будет не одна(как в твоем примере) а 50000000. так что это очевидно не спасет.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0764 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.