Название: Работа с большими объёмами данных. Отправлено: Bepec от Февраль 13, 2013, 15:57 Приветствую уважаемых знатоков и новичков :)
Имеется программа для работы с файлами. Собственно часть её работы - проверка файлов на уникальность и создание списков файлов. Данные сохраняются в структуру данных, содержащую путь к файлу и его хеш. (примерно 150 символов в общем). Проблема: При количестве файлов более 2,5 млн (100 гб файлов) программа потребляет более 2 гб памяти и вываливается в эксепшн (ограничение x86 программ). Собственно я вижу два варианта решения проблемы: 1) Забитие данных в базу Sql и работа с ней (запросами). Но в этом случае страдает скорость при проверке и заполнении базы. 2) Разбитие данных на куски по алфавиту (ориентируемся на хеш) и обрабатывает только ту часть, что подпадает под условие. Но в это случае проблема решается % на 20 и нет никаких гарантий, что хеши на букву А не превысят цифру 2,5 млн файлов. Прошу вашей оценки моих предположений. Так же жду ваших и буду очень благодарен ссылкам на схожие темы/решения/книги. Название: Re: Работа с большими объёмами данных. Отправлено: Igors от Февраль 13, 2013, 16:14 2) Разбитие данных на куски по алфавиту (ориентируемся на хеш) Правильная идея, но без алфавита. Данные разбиваются на блоки (страницы). Если блока нет в памяти - он подгружается с диска. При этом, возможно, наименее используемый блок сбрасывается на диск. Название: Re: Работа с большими объёмами данных. Отправлено: _OLEGator_ от Февраль 13, 2013, 16:16 А чем собственно второй вариант отличается от создания своей версии БД?
Название: Re: Работа с большими объёмами данных. Отправлено: xokc от Февраль 13, 2013, 16:32 В общем-то ничем. Любой современный движок БД умеет кешировать страницы данных. Правда тут я бы noSql (key-value) БД использовал если сложные выборки не нужны.
Название: Re: Работа с большими объёмами данных. Отправлено: Bepec от Февраль 13, 2013, 16:57 Собственно во втором варианте имеется проблема. Нужно проверять уникальность, т.е. проходить по всему массиву и проверять совпадение.
noSql я не пробовал. Не можете посоветовать простую библиотеку (простую в смысле доступную (free) и желательно с документацией и примерами). Название: Re: Работа с большими объёмами данных. Отправлено: Old от Февраль 13, 2013, 19:21 1) Забитие данных в базу Sql и работа с ней (запросами). Но в этом случае страдает скорость при проверке и заполнении базы. Ну вы же в уже сами чувствуете, что пришло время использовать нормальное хранилище? ;)А так, переходите на 64 битную платформу, там таких ограничений нет. :) Название: Re: Работа с большими объёмами данных. Отправлено: Igors от Февраль 13, 2013, 19:32 [А так, переходите на 64 битную платформу, там таких ограничений нет. :) Популярная иллюзия за которую приходится платить (иногда дорого)Название: Re: Работа с большими объёмами данных. Отправлено: Old от Февраль 13, 2013, 19:33 Популярная иллюзия за которую приходится платить (иногда дорого) В вашем случае я не удивлен... :)То Верес: То дядька пугает... :) Название: Re: Работа с большими объёмами данных. Отправлено: Bepec от Февраль 13, 2013, 19:58 Я согласен с igors - пока что > 70% компов x86 ) А 4 гб будет явно нехватать для 7 млн файлов :D
Название: Re: Работа с большими объёмами данных. Отправлено: Igors от Февраль 13, 2013, 20:56 Популярность заблуждения в том что, мол, "вот теперь у меня 150 терабайт адресного пр-ва - и похрен мне все отказы памяти". Да, в 64 это возможно - но увы, за это часто приходится заплатить скоростью работы которая падает в десять и более раз (вся силенка уходит в свап)
Название: Re: Работа с большими объёмами данных. Отправлено: Old от Февраль 13, 2013, 20:57 (вся силенка уходит в свап) Ну с дуру можно и ... поломать. :)Название: Re: Работа с большими объёмами данных. Отправлено: Bepec от Февраль 13, 2013, 21:27 То есть совет простой - или x64, или noSql db?
Название: Re: Работа с большими объёмами данных. Отправлено: Old от Февраль 13, 2013, 21:31 То есть совет простой - или x64, или noSql db? Для хранения и обработки больших объемов информации БД подходят лучше всего.Название: Re: Работа с большими объёмами данных. Отправлено: xokc от Февраль 14, 2013, 08:27 noSql я не пробовал. Не можете посоветовать простую библиотеку (простую в смысле доступную (free) и желательно с документацией и примерами). Сам лично с noSql в таком контексте как у тебя не пользовался. Под такую задачу вроде бы MemcahedDB подходит, но это - скорее сервер БД, использующий в качестве хранилища BerkeleyDB. Если софт однопользовательский, то с BerkeleyDB я бы и начал. Интересно было бы сравнить результаты по производительности/памяти после внедрения такой БД.Название: Re: Работа с большими объёмами данных. Отправлено: Bepec от Февраль 14, 2013, 08:39 Мда, сколько открывается перед программистом, когда объём данных превышает четыре гига :D
Попробую noDb присобачить... Название: Re: Работа с большими объёмами данных. Отправлено: Old от Февраль 14, 2013, 08:51 Как я понял из первого поста, то основная задачи программы быстро проверить уникальность по хешу.
Тогда можно снизить объем занимаемой памяти, за счет путей к файлам. В памяти хранить только хеши и уникальные id путей. А пути загружать только для нужных хешей с диска. И держать их в кеше, что бы не используемые убирались. Но наверное лучше сразу перейти на БД. Название: Re: Работа с большими объёмами данных. Отправлено: Bepec от Февраль 14, 2013, 08:53 Хм Хм Хм.
Выпал в осадок на третьем компиляторе при сборке leveldb noSql. Неужели нет никаких стандартов по составлению мейкфайлов? Вроде пишут что под винду портирована, вот только как её собрать? Чесслово в растерянности. Жуткая всё же вещь этот линукс. Название: Re: Работа с большими объёмами данных. Отправлено: xokc от Февраль 14, 2013, 09:23 А тут смотрел?
http://code.google.com/p/leveldb/source/browse/WINDOWS?name=windows Название: Re: Работа с большими объёмами данных. Отправлено: Bepec от Февраль 14, 2013, 09:30 Кхм. То ли у меня истерика после отпуска :D :o ??? :( >:( :-\ :P
Там для 2010, не могу сообразить как для 2008 сотворить. Пробую. Кхм. Как весело оказывается собирать проекты :) Особенно под x64, особенно с непонятными инклудами :) PS отложил до вечера. А то чую уже нервничать начинаю :D Название: Re: Работа с большими объёмами данных. Отправлено: Igors от Февраль 14, 2013, 11:28 Здесь еще такой момент. 2.5 * 150 = заметно меньше даже 1 гига, Возможно (просто возможно, необязательно) падает на попытке выделить слишком большой блок памяти. Напр QHash, насколько я помню, хранит данные 1 блоком. Во всяком случае не все ОC позволяют выделять "сколько хочу" даже если физически память есть.
Название: Re: Работа с большими объёмами данных. Отправлено: Bepec от Февраль 14, 2013, 12:00 Igors, вы правы, заметно меньше. Но в довесок к этой информации идёт путь к файлу. Который до 1024 символов к сожалению.
Уважаемый old предложил как раз уменьшить потребление в виде сохранения путей в индексированном контейнере на диске. Название: Re: Работа с большими объёмами данных. Отправлено: xokc от Февраль 14, 2013, 14:53 Кхм. Как весело оказывается собирать проекты :) Особенно под x64, особенно с непонятными инклудами :) Собрал под VS2012 x64. Есть нюансы :).PS отложил до вечера. А то чую уже нервничать начинаю :D 1. LevelDb качать отсюда: https://nodeload.github.com/Reactive-Extensions/LevelDB/zip/master Там есть солюшен для сборки 2. Качаем boost 1.53. 3. Если не хотим собирать еще и boost качаем уже собранные lib отсюда http://boost.teeks99.com/bin/boost_1_53_0-vc64-bin.exe 4. Распаковываем boost и прописываем в переменную окружения BOOST путь к распакованному boost 5. Открываем LevelDB.sln в VS и проверяем, что в путях для lib указан правильный путь к boost lib. 6. Добавляем конфигурацию для x64 (если нужно), Build Solution - в папке x64\Release получаем LevelDB.dll P.S. Подозреваю, что в Linux это всё собралось бы парой команд в консоли. Название: Re: Работа с большими объёмами данных. Отправлено: Bepec от Февраль 14, 2013, 15:51 Да вот собственно и злость у мну возникает, когда в линуксе собирается одной командой, а вот блин на винде необходимо пляски устраивать с бубном. (не относится к новому солюшему, если уж в нём есть готовый проект.)
PS да и есть у меня подозрение непроверенное что там файл проекта VS2012. Который для VS2008 является "просто неизвестной версией файла проекта". Название: Re: Работа с большими объёмами данных. Отправлено: xokc от Февраль 14, 2013, 16:07 PS да и есть у меня подозрение непроверенное что там файл проекта VS2012. Который для VS2008 является "просто неизвестной версией файла проекта". Точно, что не 2012 - у меня конвертировалось под 2012. Но может быть 2010 :( |