Russian Qt Forum
Ноябрь 24, 2024, 11:21 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Работа с большими объёмами данных.  (Прочитано 10227 раз)
Bepec
Гость
« : Февраль 13, 2013, 15:57 »

Приветствую уважаемых знатоков и новичков Улыбающийся

Имеется программа для работы с файлами. Собственно часть её работы - проверка файлов на уникальность и создание списков файлов.

Данные сохраняются в структуру данных, содержащую путь к файлу и его хеш.  (примерно 150 символов в общем).

Проблема: При количестве файлов более 2,5 млн (100 гб файлов) программа потребляет более 2 гб памяти и вываливается в эксепшн (ограничение x86 программ).

Собственно я вижу два варианта решения проблемы:

1) Забитие данных в базу Sql и работа с ней (запросами). Но в этом случае страдает скорость при проверке и заполнении базы.

2) Разбитие данных на куски по алфавиту (ориентируемся на хеш) и обрабатывает только ту часть, что подпадает под условие. Но в это случае проблема решается % на 20 и нет никаких гарантий, что хеши на букву А не превысят цифру 2,5 млн файлов.

Прошу вашей оценки моих предположений. Так же жду ваших и буду очень благодарен ссылкам на схожие темы/решения/книги.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Февраль 13, 2013, 16:14 »

2) Разбитие данных на куски по алфавиту (ориентируемся на хеш)
Правильная идея, но без алфавита. Данные разбиваются на блоки (страницы). Если блока нет в памяти - он подгружается с диска. При этом, возможно, наименее используемый блок сбрасывается на диск.   
Записан
_OLEGator_
Гость
« Ответ #2 : Февраль 13, 2013, 16:16 »

А чем собственно второй вариант отличается от создания своей версии БД?
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #3 : Февраль 13, 2013, 16:32 »

В общем-то ничем. Любой современный движок БД умеет кешировать страницы данных. Правда тут я бы noSql (key-value) БД использовал если сложные выборки не нужны.
Записан
Bepec
Гость
« Ответ #4 : Февраль 13, 2013, 16:57 »

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

noSql я не пробовал. Не можете посоветовать простую библиотеку (простую в смысле доступную (free) и желательно с документацией и примерами).
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #5 : Февраль 13, 2013, 19:21 »

1) Забитие данных в базу Sql и работа с ней (запросами). Но в этом случае страдает скорость при проверке и заполнении базы.
Ну вы же в уже сами чувствуете, что пришло время использовать нормальное хранилище? Подмигивающий

А так, переходите на 64 битную платформу, там таких ограничений нет. Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Февраль 13, 2013, 19:32 »

[А так, переходите на 64 битную платформу, там таких ограничений нет. Улыбающийся
Популярная иллюзия за которую приходится платить (иногда дорого)
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #7 : Февраль 13, 2013, 19:33 »

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

То Верес: То дядька пугает... Улыбающийся
Записан
Bepec
Гость
« Ответ #8 : Февраль 13, 2013, 19:58 »

Я согласен с igors - пока что > 70% компов x86 ) А 4 гб будет явно нехватать для 7 млн файлов Веселый
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Февраль 13, 2013, 20:56 »

Популярность заблуждения в том что, мол, "вот теперь у меня 150 терабайт адресного пр-ва - и похрен мне все отказы памяти". Да, в 64 это возможно - но увы, за это часто приходится заплатить скоростью работы которая падает в десять и более раз (вся силенка уходит в свап)
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #10 : Февраль 13, 2013, 20:57 »

(вся силенка уходит в свап)
Ну с дуру можно и ... поломать. Улыбающийся
Записан
Bepec
Гость
« Ответ #11 : Февраль 13, 2013, 21:27 »

То есть совет простой - или x64, или noSql db?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #12 : Февраль 13, 2013, 21:31 »

То есть совет простой - или x64, или noSql db?
Для хранения и обработки больших объемов информации БД подходят лучше всего.
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #13 : Февраль 14, 2013, 08:27 »

noSql я не пробовал. Не можете посоветовать простую библиотеку (простую в смысле доступную (free) и желательно с документацией и примерами).
Сам лично с noSql  в таком контексте как у тебя не пользовался. Под такую задачу вроде бы MemcahedDB подходит, но это - скорее сервер БД, использующий в качестве хранилища BerkeleyDB. Если софт однопользовательский, то с BerkeleyDB я бы и начал. Интересно было бы сравнить результаты по производительности/памяти после внедрения такой БД.
Записан
Bepec
Гость
« Ответ #14 : Февраль 14, 2013, 08:39 »

Мда, сколько открывается перед программистом, когда объём данных превышает четыре гига Веселый

Попробую noDb присобачить...
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.053 секунд. Запросов: 23.