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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Поиск в файле  (Прочитано 6431 раз)
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« : Октябрь 27, 2014, 17:44 »

Привет друзья!
Имеется файл в сыром формате. Представляет из себя массив double.
Необходимо найти первое повстречавшееся значение 0.99, затем 0.98, далее 0.97 и так до 0.01.
Размеры файлов, в которых будет производиться поиск может превышать 500 Гб.
Существует большая вероятность, что числа в файле будут встречаться в убывающем порядке.
Также есть вероятность, что какое-либо число может не встретиться в файле вовсе.

Каким образом оптимально проиндексировать все повстречавшиеся в файле значения от 0.99 до 0.01 с шагом 0.01?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Октябрь 28, 2014, 11:08 »

Любой ассоциативный контейнер, напр QHash <double, qint64>, но можно и QMap, std::map и.т.п.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #2 : Октябрь 28, 2014, 11:35 »

Что хранить в нем - это понятно.
А как искать? Чтением в QByteArray и дальнейшим перебором пока еще неповстречавшихся?
« Последнее редактирование: Октябрь 28, 2014, 12:35 от __Heaven__ » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Октябрь 28, 2014, 11:43 »

Что хранить в нем - это понятно.
А как искать? Чтением в QByteArray и дальнейшим перепором пока еще неповстречавшихся?
Читаете файл кусками по 64K напр в QByteArray и перебираете doublе за double. Если значение есть в хеше - сразу дальше, иначе сначала заносите в хеш
Записан
vulko
Гость
« Ответ #4 : Октябрь 28, 2014, 12:27 »

Цитировать
Читаете файл кусками по 64K напр в QByteArray и перебираете doublе за double. Если значение есть в хеше - сразу дальше, иначе сначала заносите в хеш

капитан говнокодинг вновь отличился)))


Читать посоветовал бы в 4 потока хотя бы.
Иначе есть вариант уснуть на клавиатуре Улыбающийся

Хэш-таблица возможно не лучший вариант. Учитывая что искомые значения фиксированы, то их всего 100 штук. Лучше воспользоваться массивом либо вектором, главное чтобы он на стэке жил, а не в куче.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #5 : Октябрь 28, 2014, 13:53 »

Лучше воспользоваться массивом либо вектором, главное чтобы он на стэке жил, а не в куче.
Вот это не совсем понял. Как такое организовывается?

У меня пока что видется только такая мысль. Нужно в одном потоке вести чтение и создавать очередь из QByteArray'ев фиксированной длинны. Создать 4 потока, которые будут забирать к себе из очереди QByteArray. Далее поток будет перегонять QByteArray в QVector и там уже через indexof искать необходимые значения. Ну, и понятно, что будет список ненайденных пока еще значений, который должен быть обезопасен от двойного удаления и массив найденых (защита от перезаписи тут уже не важна).

Как такой вариант по производительности?
Записан
vulko
Гость
« Ответ #6 : Октябрь 28, 2014, 14:22 »

У меня пока что видется только такая мысль. Нужно в одном потоке вести чтение и создавать очередь из 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 Offline

Сообщений: 2130



Просмотр профиля
« Ответ #7 : Октябрь 28, 2014, 14:55 »

В идеале было бы читать файл в 4 потока и в 4 потока обрабатывать. Ну или 2+2. Зависит от конкретной машины.
А наличие более одного потока на чтение одного файла это нормально? они не будут друг с другом конфликтовать? Я эту кухню не знаю, но ощущение такое, что чтение  одним потоком быстрее двух.
Записан
vulko
Гость
« Ответ #8 : Октябрь 28, 2014, 15:13 »

В идеале было бы читать файл в 4 потока и в 4 потока обрабатывать. Ну или 2+2. Зависит от конкретной машины.
А наличие более одного потока на чтение одного файла это нормально? они не будут друг с другом конфликтовать? Я эту кухню не знаю, но ощущение такое, что чтение  одним потоком быстрее двух.


Скорость чтения ессесно будет упираться в возможности физического устройства.
Соотв. нужно несколько устройств. Например 2 винта, на обоих один и тот же файл.
Читаем в ~ 2 раза быстрее. Обработка прочитанных данных не должна занимать много времени и будет работать быстрее чтения.

Для начала твой вариант вполне подходит. Когда протестируешь свой вариант в реальных условиях, можно подумать как оптимизировать процесс.
Скорее всего скорость работы будет упираться в скорость чтения файла.
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #9 : Ноябрь 04, 2014, 11:01 »

хм, может есть смысл тут сделать распределенные вычисления, т.е. сделать один сервер, который читает файлы кусками, несколько клиентов на других машинах, которые эти куски обрабатывают и возвращают результат, сервер собирает результаты. После того как клиент вернул результат, дать ему следующий кусок файла, при чем чтение будет не последовательное, т.к. разные клиенты могут завершить свои вычисления в разное время.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #10 : Ноябрь 04, 2014, 18:52 »

хм, может есть смысл тут сделать распределенные вычисления, т.е. сделать один сервер, который читает файлы кусками, несколько клиентов на других машинах, которые эти куски обрабатывают и возвращают результат, сервер собирает результаты. После того как клиент вернул результат, дать ему следующий кусок файла, при чем чтение будет не последовательное, т.к. разные клиенты могут завершить свои вычисления в разное время.
Не, это что-то мощное Улыбающийся
У меня обычный конвертер и программа пишется для себя. Будет правильнее все делать на одной машине. Просто хотелось добавить скорости. Сервер мне точно не дадут.
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #11 : Ноябрь 05, 2014, 11:28 »

опять же, как часто у вас будет производиться поиск и все такое. может как то можно задействовать GPU для этой задачи?
Записан
vulko
Гость
« Ответ #12 : Ноябрь 05, 2014, 12:20 »

опять же, как часто у вас будет производиться поиск и все такое. может как то можно задействовать GPU для этой задачи?

gpu не справится быстрее с этой задачей, т.к. тут весь затык в скорости чтения из файла.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #13 : Ноябрь 05, 2014, 13:28 »

опять же, как часто у вас будет производиться поиск и все такое. может как то можно задействовать GPU для этой задачи?

gpu не справится быстрее с этой задачей, т.к. тут весь затык в скорости чтения из файла.
Поддерживаю. Процессор обрабатывает значения (не хочу соврать) в тысячи раз быстрее, чем данные считываются с HDD.
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #14 : Ноябрь 06, 2014, 12:32 »

ну как решение задачи - читать с SSD. ну это в зависимости от важности задачи.
если не критично, то пусть всю ночь колбасит поиски ). А если нужно часто, то я предложил вариант распределенного вычисления )
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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