10606
|
Qt / Общие вопросы / Re: (почти БД) Как быстрее обработать большой файл?
|
: Март 05, 2010, 16:11
|
а потом обрабатываеть простым циклом или же есть способ заюзать запрос какой-нибудь?
Не знаю что значит "обрабатывать". Если есть вектор theStr - то все данные уже на руках. Как перерисовать таблицу - точно не скажу, но добавлять строку за строкой не следует. Я бы смотрел в сторону data model, основанной на theLogData и theStr. Считал данные, сказал таблице setModel - готово. Насчет "слежки" - имеет смысл полагать что данные доливаются в конец лога (append). Это можно проверить используя даты создания и модификации файла. Если это не так - ничего не попишешь, придется перечитать весь файл. Чтение "хвоста" такое же как и всего файла - надо только сначала сделать seek на хвост и resize для theLogData.
|
|
|
10607
|
Программирование / Алгоритмы / [РЕШЕНО] OpenMP и деление дерева
|
: Март 05, 2010, 14:29
|
Добрый день
Использую OpenMP и весьма доволен этой библиотекой. Не могу сообразить как мне распараллелить деление дерева, алгоритм стандартный:
- Есть очередь нодов, (вначале только с 1 нодом). - Извлекаем первый нод из очереди, делим его на 2 нода - Подсчитываем приоритеты получившихся нодов, и, если надо, добавляем их в очередь - Опять извлекаем первый нод (нод с наивысшим приоритетом) из очереди и.т.д
Нод хранит список примитивов которые его пересекают. Приоритет вычисляется как число примитивов в ноде помноженное на его размер. Все работает. Теперь как задействовать N ниток? Понятно что помещение в очередь и извлечение из нее должны быть защищены блокировками. Возможна ситуация когда очередь пуста, но это не значит "конец расчета" - нод(ы) делятся в др. нитках. Как бы мне это все организовать попроще и покрасивее?
Спасибо
|
|
|
10608
|
Qt / Общие вопросы / Re: (почти БД) Как быстрее обработать большой файл?
|
: Март 05, 2010, 10:43
|
Не совсем БД это, но теоретически, очень даже похоже. Есть log-файл одной проги. Сейчас он занимает около 12 метров.
12 метров - это по нынешним временам не объем (да и по вчерашним тоже). Где-то до 500 метров можно жить просто читая весь файл в память, не связываясь с БД Хочу попросить совета по первому пункту. Как это лучше организовать? я вчера набросал тестовый проект (в QTreeWidget пихаю все различные символы в позиции string[22] всего файла (это идет секунд 15). потом перебором (уже вторым, знаю, что не оптимизировано) по двойному щелчку на QTreeWidgetItem я начинаю поиск (цикл с условием на сравнение этого символа в 22 позиции) нужных мне строк, которые потом запихиваю в QTableWidget в две колонки: первая - ДО символа в 22 позиции, вторая - все, что после него). И вот эта операция занимает аж несколько минут, при котором прога подвисает (без потоков пока делал, просто проверить).
Читаем все в 1 блок памяти (без QString), разбираем строки и "позицию 22", это должно занять до 5 секунд даже на слабеньком железе и без всяких потоков. Вот затем можно подумать как лучше/быстрее добавить это в UI. Данные я бы организовал так: QVector <char> theLogData; // содержимое файла скопированное в память
struct MyStr { int mBeg1; // смещение первой суб-строки в theLogData int mBeg2; // смещение второй суб-строки в theLogData int mEnd; // смещение конца строки int mKey22; // значение в "позиции 22" };
QVector <MyStr> theStr; // в результате разборок этот вектор заполнен
А строки получать в делегате, незачем их хранить
|
|
|
10610
|
Qt / Общие вопросы / Re: Корректен ли вопрос: Чем QT лучше MFC / ATL ?
|
: Март 04, 2010, 20:20
|
Этот сайт - откровение для меня! Очень надеюсь, что QT окажется удобнее чем MFC+ATL...
Ну как сказать. "Переучиваться" всегда намного труднее чем "учиться" - старый опыт не всегда в плюс и все наработки стырены из Apple и изуродованы под ассемблер.
Да если б они, гады, по уму тырили - я бы не возражал, то их разборки. Так ведь нет, испакостят все - и заставят покупать. Ладно, это флуд, умолкаю
|
|
|
10612
|
Программирование / С/C++ / Re: Проблема с namespace
|
: Март 04, 2010, 15:30
|
Не писать static если планируете вызывать Utils::Func1(0) из др. файла. Оставьте в h файле только объявления, тела перенесите в Utils.cpp. Альтернатива: заменить static на inline. Если есть Utils-переменные они должны быть объявлены как extern в Utils.h
|
|
|
10613
|
Qt / Общие вопросы / Re: QSharedMemory - сигнал на изменение своими руками
|
: Март 03, 2010, 03:01
|
Но как я понял человек хотел, чтобы event от ОС пришел "типа поменялось".
Что человек хочет - это его дело. А моя задача была максимально быстрый обмен данными между 2 процессами (32 и 64 бит) - вот и пришлось крутить через shared memory.
|
|
|
10614
|
Qt / Общие вопросы / Re: QSharedMemory - сигнал на изменение своими руками
|
: Март 03, 2010, 01:17
|
Спасибо, идея интересна, но дальше разблокировки gui мы не ушли. Раздумываю над системой семафоров...
Там получается совсем несложно даже без Qt. Семафоры удобно заводятся в разных процессах (как мне надо было) и могут быть общими. Один процесс записал что-то в shared memory и сделал sem_post (открыл семафор), другой стоял на sem_wait, семафор открылся, забрал из shared memory, отсигналил по второму семафору и опять ушел на sem_wait. Для второго процесса - то же самое. Ну правда в posix семафоры срабатывают по сигналам, это надо проверять. На Вындоуз - аналогично, только с мутексами.
|
|
|
10616
|
Qt / Общие вопросы / Re: QList + qSort
|
: Март 02, 2010, 23:30
|
Здравствуйте, коллеги. У меня есть еще такой интересный вопрос. Я использую qSort на массиве точек. Точка описана классом Point. Point (float x, float y, float z); если в операторе "<" выполняется следующее дествие: return (x<rh.x); То все отлично. Массив точек упорядочивается по x. Если оператор выполняет следующее действие: return (x<rh.x && y<rh.y && z<rh.z); или return (x<rh.x && y<rh.y); То массив не сортируется вообще никак. То есть он сортируется, выборочно, кусками. И не правильно при этом. Может быть, здесь есть какой то прикол???
Я делаю так bool Point::operator < ( const Point & sec ) const { // первый ключ x if (x < sec.x) return true; if (x > sec.x) return false;
// второй ключ y if (y < sec.y) return true; if (y > sec.y) return false;
// третий ключ z if (z < sec.z) return true; return false; }
|
|
|
10617
|
Qt / Общие вопросы / Re: Запись в файл объектов
|
: Март 02, 2010, 03:28
|
Есть такой вопрос - в С++ я мог взять объект класс и записать его в двоичный файл примерно такой конструкцией - имена классические file.write(reinterpret_cast<char*>(&myObj), sizeof(myClass));
ВОт, потом читая из файла аналогичной конструкцией read получал объект точно такой же, какой записал. Это не будет работать для объектов имеющих виртуальные методы (указатель на VMT в sizeof входит и при чтении будет затерт). Поскольку в Qt практически все объекты с virtual - это не будет работать в Qt, надо использовать QDataStream и операторы >> и <<, сделано очень удобно.
|
|
|
10618
|
Qt / Общие вопросы / Re: Подсчет частоты слов в тексте
|
: Март 02, 2010, 02:53
|
-- Необходимо подсчитать сколько раз слово встречается в списке и убрать дубликаты. Использую контейнер QHash<QString, int> для быстрой обработки и записываю финальные Key и Value в разные списки. Но функция выдает только список уникальных слов (Key) в конце и не выводит частоты. Кроме того, функция обрабатывает текст размером 100 Кб ОЧЕНЬ медленно, может есть какие-то варианты ее оптимизировать?
Оператор [] для QHash на примере: for (int i=0; i<Token.size(); ++i) ++countWord[Token[ i ]];
Оператор возвращает ссылку на значение (у Вас int), его можно прямо менять. Если ключа (Token[ i ]) не было в QHash - он будет вставлен (с default значением, 0 для int). Для подсчетов числа вхождений - то, что надо Для печати вхождений Вы правильно "итерировались" по countWord но чего ж QDataStream объявлять в цикле? А если надо добавить к спискам, то проще countWord.keys() и countWord.values() вместо цикла. Удаление дубликатов также легко и приятно QStringList outLst; for (int i=0; i<Token.size(); ++i) if (countWord[Token[ i ]] < 2) outLst.push_back(Token[ i ]]);
Здесь никаких вставок в countWord не произойдет, т.к. все ключи созданы при подсчете вхождений Edit: может если 2 и более вхождения - то надо убрать все кроме первого? Тогда тоже легко, напр QStringList outLst; for (int i=0; i<Token.size(); ++i) { int & val = countWord[Token[ i ]]; if (val < 0) continue; // второе или след вхождение, пропускаем outLst.push_back(Token[ i ]]); if (val > 1) val = -val; // отмечаем }
|
|
|
10619
|
Программирование / Алгоритмы / Re: Параллельные вычисления
|
: Февраль 28, 2010, 13:11
|
Параллелить по треугольникам возможно но неудобно. Во-первых вылазит много блокировок связанных с тем что, как правило, треугольники имеют общие ребра. А главное - мне очень трудно избавиться от массы временных данных, распределяемых при обработке каждого треугольника. Сделал так: набиваю пул точек для расчета (сохраняю также данные о блоках). После каждого треугольника смотрю - если в пуле достаточно точек - запускаю их расчет всеми нитками, потом осредняю. очищаю временные данные, пошел дальше. Работает, но к сожалению текст не так прост как хотелось бы
|
|
|
10620
|
Qt / Общие вопросы / Re: Передача значения в главный поток. (Qt 4.6)
|
: Февраль 28, 2010, 12:55
|
Если connect связывает 2 QObject созданных а разных нитках - то обмен сигнал/слот будет производиться только через QEvenLoop - и для DirectConnection тоже (просто вызывающий будет ждать пока событие принято из QEvenLoop приемника и обработано)
Здесь я был неправ (ошибся разбирая исходники). После критики BRE сделал тестовый примерчик (attachment) - да, все работает согласно документации, и вызов слота c DirectConnection происходит в нитке вызывающего.
|
|
|
|
|