Russian Qt Forum
Ноябрь 23, 2024, 11:31
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Общие вопросы
>
Поиск в файле
Страниц: [
1
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Поиск в файле (Прочитано 6426 раз)
__Heaven__
Джедай : наставник для всех
Offline
Сообщений: 2130
Поиск в файле
«
:
Октябрь 27, 2014, 17:44 »
Привет друзья!
Имеется файл в сыром формате. Представляет из себя массив double.
Необходимо найти первое повстречавшееся значение 0.99, затем 0.98, далее 0.97 и так до 0.01.
Размеры файлов, в которых будет производиться поиск может превышать 500 Гб.
Существует большая вероятность, что числа в файле будут встречаться в убывающем порядке.
Также есть вероятность, что какое-либо число может не встретиться в файле вовсе.
Каким образом оптимально проиндексировать все повстречавшиеся в файле значения от 0.99 до 0.01 с шагом 0.01?
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Поиск в файле
«
Ответ #1 :
Октябрь 28, 2014, 11:08 »
Любой ассоциативный контейнер, напр QHash <double, qint64>, но можно и QMap, std::map и.т.п.
Записан
__Heaven__
Джедай : наставник для всех
Offline
Сообщений: 2130
Re: Поиск в файле
«
Ответ #2 :
Октябрь 28, 2014, 11:35 »
Что хранить в нем - это понятно.
А как искать? Чтением в QByteArray и дальнейшим перебором пока еще неповстречавшихся?
«
Последнее редактирование: Октябрь 28, 2014, 12:35 от __Heaven__
»
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Поиск в файле
«
Ответ #3 :
Октябрь 28, 2014, 11:43 »
Цитата: __Heaven__ от Октябрь 28, 2014, 11:35
Что хранить в нем - это понятно.
А как искать? Чтением в QByteArray и дальнейшим перепором пока еще неповстречавшихся?
Читаете файл кусками по 64K напр в QByteArray и перебираете doublе за double. Если значение есть в хеше - сразу дальше, иначе сначала заносите в хеш
Записан
vulko
Гость
Re: Поиск в файле
«
Ответ #4 :
Октябрь 28, 2014, 12:27 »
Цитировать
Читаете файл кусками по 64K напр в QByteArray и перебираете doublе за double. Если значение есть в хеше - сразу дальше, иначе сначала заносите в хеш
капитан говнокодинг вновь отличился)))
Читать посоветовал бы в 4 потока хотя бы.
Иначе есть вариант уснуть на клавиатуре
Хэш-таблица возможно не лучший вариант. Учитывая что искомые значения фиксированы, то их всего 100 штук. Лучше воспользоваться массивом либо вектором, главное чтобы он на стэке жил, а не в куче.
Записан
__Heaven__
Джедай : наставник для всех
Offline
Сообщений: 2130
Re: Поиск в файле
«
Ответ #5 :
Октябрь 28, 2014, 13:53 »
Цитата: vulko от Октябрь 28, 2014, 12:27
Лучше воспользоваться массивом либо вектором, главное чтобы он на стэке жил, а не в куче.
Вот это не совсем понял. Как такое организовывается?
У меня пока что видется только такая мысль. Нужно в одном потоке вести чтение и создавать очередь из QByteArray'ев фиксированной длинны. Создать 4 потока, которые будут забирать к себе из очереди QByteArray. Далее поток будет перегонять QByteArray в QVector и там уже через indexof искать необходимые значения. Ну, и понятно, что будет список ненайденных пока еще значений, который должен быть обезопасен от двойного удаления и массив найденых (защита от перезаписи тут уже не важна).
Как такой вариант по производительности?
Записан
vulko
Гость
Re: Поиск в файле
«
Ответ #6 :
Октябрь 28, 2014, 14:22 »
Цитата: __Heaven__ от Октябрь 28, 2014, 13:53
У меня пока что видется только такая мысль. Нужно в одном потоке вести чтение и создавать очередь из QByteArray'ев фиксированной длинны. Создать 4 потока, которые будут забирать к себе из очереди QByteArray. Далее поток будет перегонять QByteArray в QVector и там уже через indexof искать необходимые значения. Ну, и понятно, что будет список ненайденных пока еще значений, который должен быть обезопасен от двойного удаления и массив найденых (защита от перезаписи тут уже не важна).
Как такой вариант по производительности?
Скорее всего затык будет в чтении.
Ну допустим можно не более 100мб начитать в ОЗУ (зависит от конкретной машины), это 2% от 500гб файла.
Разбирать данные будут быстро. Читать с жесткого насителя куда медленнее.
В итоге 4 потока будут тут ни к чему, т.к. не дадут большой производительности.
В идеале было бы читать файл в 4 потока и в 4 потока обрабатывать. Ну или 2+2. Зависит от конкретной машины.
Я тут недавно смотрел за сколько 300мб файл прочитается в память + парсинг структур. Примерно 8 сек.
500гб это уже не шутки. Тут можно и на пару часов попасть в легкую...
Впрочем для начала вариант норм. Можно будет натыкать немного логов и посмотреть, не многовато ли 4 потока для обработки. Может и 2-х хватит, а то и вообще одного.
Скорее всего очередь из QByteArray'ев будет всегда пустой, значит затык в скорости чтения.
Цитировать
Вот это не совсем понял. Как такое организовывается?
Если искаться будет фиксированное количество значений, например 0.01-0.99, то значений будет всего 100.
Никаких Map'ов тут не нужно, для 100 элементов они куда медленнее обычного массива. Даже хэш таблица даст ощутимый прирост в скорости поиска начиная где-то с 10-100 тысяч элементов.
Соотв. найденные элементы не нужно запихивать в map. Используй обычный массив/вектор.
Записан
__Heaven__
Джедай : наставник для всех
Offline
Сообщений: 2130
Re: Поиск в файле
«
Ответ #7 :
Октябрь 28, 2014, 14:55 »
Цитата: vulko от Октябрь 28, 2014, 14:22
В идеале было бы читать файл в 4 потока и в 4 потока обрабатывать. Ну или 2+2. Зависит от конкретной машины.
А наличие более одного потока на чтение одного файла это нормально? они не будут друг с другом конфликтовать? Я эту кухню не знаю, но ощущение такое, что чтение одним потоком быстрее двух.
Записан
vulko
Гость
Re: Поиск в файле
«
Ответ #8 :
Октябрь 28, 2014, 15:13 »
Цитата: __Heaven__ от Октябрь 28, 2014, 14:55
Цитата: vulko от Октябрь 28, 2014, 14:22
В идеале было бы читать файл в 4 потока и в 4 потока обрабатывать. Ну или 2+2. Зависит от конкретной машины.
А наличие более одного потока на чтение одного файла это нормально? они не будут друг с другом конфликтовать? Я эту кухню не знаю, но ощущение такое, что чтение одним потоком быстрее двух.
Скорость чтения ессесно будет упираться в возможности физического устройства.
Соотв. нужно несколько устройств. Например 2 винта, на обоих один и тот же файл.
Читаем в ~ 2 раза быстрее. Обработка прочитанных данных не должна занимать много времени и будет работать быстрее чтения.
Для начала твой вариант вполне подходит. Когда протестируешь свой вариант в реальных условиях, можно подумать как оптимизировать процесс.
Скорее всего скорость работы будет упираться в скорость чтения файла.
Записан
Fregloin
Супер
Offline
Сообщений: 1025
Re: Поиск в файле
«
Ответ #9 :
Ноябрь 04, 2014, 11:01 »
хм, может есть смысл тут сделать распределенные вычисления, т.е. сделать один сервер, который читает файлы кусками, несколько клиентов на других машинах, которые эти куски обрабатывают и возвращают результат, сервер собирает результаты. После того как клиент вернул результат, дать ему следующий кусок файла, при чем чтение будет не последовательное, т.к. разные клиенты могут завершить свои вычисления в разное время.
Записан
__Heaven__
Джедай : наставник для всех
Offline
Сообщений: 2130
Re: Поиск в файле
«
Ответ #10 :
Ноябрь 04, 2014, 18:52 »
Цитата: Fregloin от Ноябрь 04, 2014, 11:01
хм, может есть смысл тут сделать распределенные вычисления, т.е. сделать один сервер, который читает файлы кусками, несколько клиентов на других машинах, которые эти куски обрабатывают и возвращают результат, сервер собирает результаты. После того как клиент вернул результат, дать ему следующий кусок файла, при чем чтение будет не последовательное, т.к. разные клиенты могут завершить свои вычисления в разное время.
Не, это что-то мощное
У меня обычный конвертер и программа пишется для себя. Будет правильнее все делать на одной машине. Просто хотелось добавить скорости. Сервер мне точно не дадут.
Записан
Fregloin
Супер
Offline
Сообщений: 1025
Re: Поиск в файле
«
Ответ #11 :
Ноябрь 05, 2014, 11:28 »
опять же, как часто у вас будет производиться поиск и все такое. может как то можно задействовать GPU для этой задачи?
Записан
vulko
Гость
Re: Поиск в файле
«
Ответ #12 :
Ноябрь 05, 2014, 12:20 »
Цитата: Fregloin от Ноябрь 05, 2014, 11:28
опять же, как часто у вас будет производиться поиск и все такое. может как то можно задействовать GPU для этой задачи?
gpu не справится быстрее с этой задачей, т.к. тут весь затык в скорости чтения из файла.
Записан
__Heaven__
Джедай : наставник для всех
Offline
Сообщений: 2130
Re: Поиск в файле
«
Ответ #13 :
Ноябрь 05, 2014, 13:28 »
Цитата: vulko от Ноябрь 05, 2014, 12:20
Цитата: Fregloin от Ноябрь 05, 2014, 11:28
опять же, как часто у вас будет производиться поиск и все такое. может как то можно задействовать GPU для этой задачи?
gpu не справится быстрее с этой задачей, т.к. тут весь затык в скорости чтения из файла.
Поддерживаю. Процессор обрабатывает значения (не хочу соврать) в тысячи раз быстрее, чем данные считываются с HDD.
Записан
Fregloin
Супер
Offline
Сообщений: 1025
Re: Поиск в файле
«
Ответ #14 :
Ноябрь 06, 2014, 12:32 »
ну как решение задачи - читать с SSD. ну это в зависимости от важности задачи.
если не критично, то пусть всю ночь колбасит поиски ). А если нужно часто, то я предложил вариант распределенного вычисления )
Записан
Страниц: [
1
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...