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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Большие массивы, Нехватка памяти 
:(
    Опции темы
nuke4303
Дата 10.2.2011, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте. Возникла проблема, заключающуюся в том что мое приложение использует большие массивы(List,ArrayList) данных которые хранятся естественно в оперативной памяти, общий размер которых привышает 2-3ГБ. Естественно возникают эксепшены что память переполнена. Есть ли в НЕТ способ позволяющий работать например с классами содержащими такие размеры данных не в оперативной памяти, а с файлом на диске, то есть чтобы программа также работала как и работает, но всю свою память хранила в каком нибудь файле. Хотел спользовать FileMapping но тогда возникает проблема, как работать(запись\чтение) с классам помещенным туда ведь он преобразовывается в байты, и как потом получить доступ например к какимнить аттрибутам класса.
PM MAIL   Вверх
KelTron
Дата 10.2.2011, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(nuke4303 @  10.2.2011,  09:51 Найти цитируемый пост)
общий размер которых привышает 2-3Г

А база данных чем не подходит? SQLite или SQL CE например.


--------------------
Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог.
Эвенгар Салладорский, основатель Школы Тьмы.
PM MAIL   Вверх
Экскалупатор
Дата 10.2.2011, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



nuke4303, а почему у тебя классы хранят столько информации? раздели данные и обработку данных. вариант с базой данных очень кошерный. принцип тот же - отделяешь данные, запихиваешь их в базу данных, потом тянешь по необходимости из базы мелкими порциями. если не загоняться с базой то можно написать самому хранение в файлах, это не так сложно(особенно если ты не сразу начал работать с шарпом, а до этого делал какие нить элементарные задачки на СИ, etc, они сильно помогают представить как это все работает в "живую", особенно задачи в которых по условию запрещено загружать все данные из файла в память и надо менять значения непосредственно в файле). написать пару классов которые будут сохранять и читать данные из файла. главное грамотно разделить.
PM MAIL ICQ   Вверх
nuke4303
Дата 10.2.2011, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Экскалупатор @  10.2.2011,  12:35 Найти цитируемый пост)
 написать пару классов которые будут сохранять и читать данные из файла. главное грамотно разделить. 


В томто и проблема, что слить в один файл все данные, это просто, а вот потом извлеч нужный блок да и еще с возможностью замены частей блока другой длины без перезаписи всего файла не знаю как.
Насчет SQLite, какова скорость работы с большими объемами записей? Можно ли там заменять один блок данных другим?
PM MAIL   Вверх
KelTron
Дата 10.2.2011, 13:44 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(nuke4303 @  10.2.2011,  13:15 Найти цитируемый пост)
Насчет SQLite, какова скорость работы с большими объемами записей? Можно ли там заменять один блок данных другим?

Думаю сначала тебе надо изучить что такое база данных и как с ней работать, потом уже переходить к использованию SQLite


--------------------
Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог.
Эвенгар Салладорский, основатель Школы Тьмы.
PM MAIL   Вверх
Экскалупатор
Дата 10.2.2011, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



KelTron, согласен, без основ в этом деле никак. 

nuke4303, а для 
Цитата(nuke4303 @  10.2.2011,  12:15 Найти цитируемый пост)
вот потом извлеч нужный блок да и еще с возможностью замены частей блока 

как раз таки полезно порешать задачи описанные мной выше. блок имеет конкретную длину байт, значит отсчитав нужное количество байт можно получить нужный блок, ну а дальше дело техники...
PM MAIL ICQ   Вверх
nuke4303
Дата 10.2.2011, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(KelTron @  10.2.2011,  13:44 Найти цитируемый пост)
Думаю сначала тебе надо изучить что такое база данных

Как рбоатать с БД я и так знаю, неоднократно писал ПО под нее.
Цитата(Экскалупатор @  10.2.2011,  14:02 Найти цитируемый пост)
как раз таки полезно порешать задачи описанные мной выше. блок имеет конкретную длину байт, значит отсчитав нужное количество байт можно получить нужный блок, ну а дальше дело техники...

Про блоки и размер я вкурсе как делать.....у блоков разные размеры, и при замене одного блока другим блоком другого размера придется переписывать весь файл, тоесть считывать его содержимое в память и заливать по новому, для меня это не приемлеммо...вот и искал способ реализовать свою собсвтенную "виртуальную память", есстевенно с максимально возможно происводительностью
PM MAIL   Вверх
Экскалупатор
Дата 10.2.2011, 23:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



если

Цитата(nuke4303 @  10.2.2011,  21:13 Найти цитируемый пост)
Как рбоатать с БД я и так знаю, неоднократно писал ПО под нее.

то откуда такой вопрос

Цитата(nuke4303 @  10.2.2011,  12:15 Найти цитируемый пост)
Можно ли там заменять один блок данных другим? 

??? люди которые работают с БД таких вопросов задавать не могут в принципе.

по поводу разной длины блоков и их замены в файлах, не обязательно считывать весь файл в память, его можно просто перезаписывать начиная с того места куда "не влезли" данные, а можно резервировать место под возможную максимальную длину данных. к примеру если предполагается что максимально возможное предложение будет 100 символов, то писать 100 символов не зависимо от того сколько их существует реально, это конечно многократно увеличит объем файла, но зато никаких перезаписей всего файла.

но БД все же кошернее, это несомненно.


з.ы. пришла в голову мысль, что можно хранить каждый блок в отдельном файле(плюс если блоки большие, т.е. получается относительно немного относительно больших блоков), тогда перезапись каждого файла не будет очень долгой, и лишнее место все это не будет занимать. но не зная предмета разговора(какие данные, сколько и пр.) сложно что либо предложить.
PM MAIL ICQ   Вверх
nuke4303
Дата 11.2.2011, 01:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Экскалупатор @  10.2.2011,  23:57 Найти цитируемый пост)
Цитата(nuke4303 @  10.2.2011,  12:15 )Можно ли там заменять один блок данных другим? ??? люди которые работают с БД таких вопросов задавать не могут в принципе.

Я работал с MySQl, Acces, MSSql и есстествеено они больше предназначаются чтобы хранить стравнительно не большие по объему блока данные. У меня же каждый блок может занимать несколько гигобайт, я не уверен что тодже Mysql выдержит это, вот и спросил про возможности SQLite.
Данные разбиты на группы, каждая группа хранится в своем List<>, листом я счтаю блок памяти, в листе много эелементов в сумме которые составляют Гб'ты. Данные при запуске приложения считываются из источника, производятся необходимые(долгие!!) операции с ними и сохраняются в эти блоки(List) по типу, далее в процессе своей работы приложение активно использует эти данные(поэтому не могу каждый раз перед запросом данных считвать его и преобразовывать, изза долготоы преобразования).....но и в памяти оперативной не могуу держать изза нехватки, вот и встает вопрос о хранении их гдето в файле, ну или в БД как выясняется

Это сообщение отредактировал(а) nuke4303 - 11.2.2011, 01:11
PM MAIL   Вверх
FF0000
Дата 11.2.2011, 01:40 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



nuke4303,   в MySQL есть тип данных LONGTEXT и LONGBLOB  размер которых  до 4 гигабайт 
в MSSql есть аналогичные но с возможностью хранить до 6 гигов (если не ошибаюсь )   
- это размеры 1 "ячейки данных", не всей таблицы или БД


а нельзя ли поинтересоваться что  за предметная область  требующая  работу с такими большими объемами данных ( причем  постоянную и одновременную .. ) ?

мне с такого рода задачами сталкиваться не приходилось но чет мне кажется  что  там не совсем все оптимально , и можно сделать попроще 


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


Эксперт
***


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

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



Цитата(nuke4303 @  11.2.2011,  00:09 Найти цитируемый пост)
в сумме которые составляют Гб'ты

много это сколько? приблизительно...

в любом случае хранить в памяти несколько гигов инфы мне кажется не разумным. это удобно только если критично время выполнения и бой идет за каждую секунду. но мне что то слабо в это верится. тут есть несколько вопросов: 1. что происходит с обработанными данными(которые долго откуда то читаются и потом долго обрабатываются) после завершения приложения? предполагаю что в утиль.а они изменяются в источнике? может лучше поменять их там и сэкономить на обработке? 2. данные нужны все сразу? или все же они используются линейно? к примеру, обработка видео(конвертация из DVD в AVI), никогда не загружается весь фильм в память, загружены только текущие и ближайшие кадры, все остальное читается с диска по необходимости и сразу же сливается на диск как только становится не нужным.

ну и отстраненные размышления. по сути память(ОЗУ) работает очень похоже на ПЗУ, в том плане что если ты выделил кусок в 1 метр, то два метра ты в него не запихнешь никак, так же и с файлами. просто если тебе нужно больше места за тебя всю работу делает система, а с файлами придется развлекаться тебе лично. в принципе это не так уж и сложно, но требует немножко больше времени на организацию и обработку. да и к тому же как ты собираешься хранить в файлах блоки разной длины? а как их потом читать? или ты еще отдельно хранишь размер каждого блока?
PM MAIL ICQ   Вверх
nuke4303
Дата 11.2.2011, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Экскалупатор @  11.2.2011,  08:57 Найти цитируемый пост)
что происходит с обработанными данными(которые долго откуда то читаются и потом долго обрабатываются) после завершения приложения? предполагаю что в утиль.а они изменяются в источнике?

Они удаляются после во время закрытия приложения. В ичтонике они не изменяются.
Цитата(Экскалупатор @  11.2.2011,  08:57 Найти цитируемый пост)
может лучше поменять их там и сэкономить на обработке?

Данные на входе всегда разные при запуске приложения.
Цитата(Экскалупатор @  11.2.2011,  08:57 Найти цитируемый пост)
данные нужны все сразу? или все же они используются линейно?

Нет нужны не все сразу, используются по примеру конвертации видео. Только они послее того как обработались и загрузились в память используются по блочно. Скорость подгрузки блоков важна!
Цитата(Экскалупатор @  11.2.2011,  08:57 Найти цитируемый пост)
да и к тому же как ты собираешься хранить в файлах блоки разной длины? а как их потом читать? или ты еще отдельно хранишь размер каждого блока? 

Вот я и озвучивал эту проблему уже про разную длину и монотонный общий файл. Поэтому хочу использовать БД. Исходные данные представляют из себя набор бинарников.
PM MAIL   Вверх
Miller_time
Дата 11.2.2011, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А может делать сериализацию данных на жеский диск и при необходимости к ним обращаться ?


--------------------
Мы делаем игрыЗДЕСЬ
PM MAIL WWW ICQ   Вверх
nuke4303
Дата 11.2.2011, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



При десериализации придется загружать все данные в память, и опять будет переполнение...это если хранить в 1 файле, что мне и нужно...размножать файлы не хочу
PM MAIL   Вверх
Miller_time
Дата 11.2.2011, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ну значит выход один увеличить кол-во памяти или файл подкачки )))
Сто процентов конечно есть выход... как нибуть можно делатить...

Это сообщение отредактировал(а) Miller_time - 11.2.2011, 11:54


--------------------
Мы делаем игрыЗДЕСЬ
PM MAIL WWW ICQ   Вверх
Экскалупатор
Дата 11.2.2011, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



nuke4303, тут узкий момент есть, в смысле что использовать базу это больше нагрузить систему, с файлами будет шустрее(это личное ИМХО). я бы все же просто дополнял блоки до максимального размера и писал их в бинарный файл, читать файл можно асинхронно, в отдельном потоке, зарание читая очередной блок информации и ставя его в очередь на обработку, а с другой стороны сохранять данные когда они достигнут какой нить критической массы(пару сотен метров, к примеру). в итоге получим что и память не будет забиваться полностью и в производительности не сильно потеряешь(это конечно с учетом что в системе не одно ядро). работа с базой будет проходить по такому же принципу, но база тяжелее файла(у нее должен работать свой сервер, запросы обрабатывать и пр....). если делать базу то проще писать, если делать с файлами то скорее всего будет шустрее работать(с учетом твоей личной грамотности как разработчика, конечно)

ну а по поводу разных блоков повторюсь, приводи их к одному размеру, тогда будет проще писать их и читать. или можно хранить информацию о величине блока в самом файле. к примеру предположим у тебя есть блок размером 100 байт, и блок размером в 200 байт. в файл можно записать так: 
100[]200[]...

т.е. сначала размер блока, потом(вместо []) сам блок данных, потом следующая пара. минус всего этого это сложность реализации.
PM MAIL ICQ   Вверх
nuke4303
Дата 11.2.2011, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Чтобы подогнать все файлы к одному размеру нужно знать размер самого большого блока(на абум делать неполучится так как размер блоков может сильно варьироваться и быть непредсказуем), а как узнать размер самого большого блока не загрузив их все в память и не плодя множества временных файлов!?...возможно бд будет оптимальным вариантом, размер файла не сильно важен, главное чтобы оператива была свободна
PM MAIL   Вверх
Экскалупатор
Дата 11.2.2011, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



а по поводу хранения информации о блоке?
PM MAIL ICQ   Вверх
nuke4303
Дата 11.2.2011, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А что по информации? Если хранить блоки в одном файле, то при замене блока придется перезаписывать весь файл, если взять стандартный какойто размер метаблока и в него всовывать блоки, то стоит проблема подбора этого максимального блока-контейнера....хочется какойто оптимальный вариант по производительность/удобство.....сложность реализации не важна
PM MAIL   Вверх
Экскалупатор
Дата 11.2.2011, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



я имел в виду хранить размер блока перед самим блоком.

Цитата(Экскалупатор @  11.2.2011,  13:19 Найти цитируемый пост)
можно хранить информацию о величине блока в самом файле. к примеру предположим у тебя есть блок размером 100 байт, и блок размером в 200 байт. в файл можно записать так: 100[]200[]...т.е. сначала размер блока, потом(вместо []) сам блок данных, потом следующая пара. минус всего этого это сложность реализации.


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


Новичок



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

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



А как тогда заменить например один блок другим большего размера....опять же повторюсь, придется тада считать все вышестоящие блоки(в память) и записать файл по новому...нехотелось бы делать столько лишних манипуляций.....хотя я сразу не понял конешно идею про размер блока, но она привлекательно выглядет
А есть тут народ который работал с темже SQLite и данными большими внем, хотелось бы узнать мнение, что быстрей бы работало встроенная СУБД или вручную формировать файл("дамп памяти")?
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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