Russian Qt Forum

Qt => Вопросы новичков => Тема начата: virtual_root от Июль 25, 2012, 18:11



Название: QFile поиск по файлу без его загрузки в память
Отправлено: virtual_root от Июль 25, 2012, 18:11
Ребят подскажите, пожалуйста, а можно ли найти сначало то что нужно в QFile, а потом загрузить в переменную? Или мне придется сначала весь файл считать? Просто у меня бинарный файл и я записала туда QMap. Теперь хочу просто не считывать все значения и ключи, а найти нужный ключ и уже тогда считать его значение. Так как файл большой. 220Кб и его размер будет расти...
Заранее извиняюсь за немного глупый вопрос, может я просто каких-то тонкостей не знаю  :-[


Название: Re: QFile поиск по файлу без его загрузки в память
Отправлено: ruzik от Июль 25, 2012, 21:17
Может я и ошибаюсь, но как можно найти значение среди массы других значений если вы не знаете последние.
Могу лишь предложить следующее:
- Сделать что-то типа файлового бинарного дерева и оставить не один файл а например сделать файлы по первому символу данных которые нужно считать, то есть имеются такие строки:
-AAA
-BBB
-CCC
-CAA
Значит 1 строка будет содержаться в файле "А"(тк начинается с А), вторая в "В", а 2 последних в "С".
Если этого начнет не хватать, то можно подразделить дальше, то есть сделать, например не файл "С", а папку С, которая будет содержать 2 файла: С и А, по 2 буквам в нужных строках(2 последние строки в списке, начинающиеся с "С", поэтому находящиеся в папке "С") и так далее хоть до бесконечности.
Хотя вполне возможно есть и другой, более адекватный выбор.


Название: Re: QFile поиск по файлу без его загрузки в память
Отправлено: _OLEGator_ от Июль 25, 2012, 22:19
Можно читать файл поблочно и искать в них.
Как сохраняешь QMap?


Название: Re: QFile поиск по файлу без его загрузки в память
Отправлено: Bepec от Июль 25, 2012, 22:49
Можно проще сделать - файл с данными + файл с ключами и их позициями.
Читаешь ключи, потом выдираешь блок данных с позиции из файла данных.

Тут уже от того зависит, что у тебя там :D


Название: Re: QFile поиск по файлу без его загрузки в память
Отправлено: TemaTre от Июль 26, 2012, 06:06
По-моему тут стоит почитать про B-деревья.

В начале файла сохраняешь B-дерево(которое отсортировано по ключам). Считываешь его, по нему выполняешь поиск. И прыгаешь на нужное место в файле. Опять же может возникнуть проблема того что файл будет слишком большим но Дерево весит не так много.

Да кстати и 200Кб это не очень то много, я бы сказал мало.  Сколько у тебя на компе оперативки? Что жалко 200Кб? Если файл будет расти просто разбивать его на несколько файлов.

Но в любом случае B-деревья тут подойдет больше всего. Они хорошо ускорят работу с файлами.


Название: Re: QFile поиск по файлу без его загрузки в память
Отправлено: _OLEGator_ от Июль 26, 2012, 10:22
Знатоки собрались, разбиение на фалы (индексация, создавать свою БД), B-дерево.
Тут же элементарный QMap последовательно записанный в файл ключ-значение, его также последовательно читаешь ключ и пропускаешь значение, пока не найдется нужный ключ.


Название: Re: QFile поиск по файлу без его загрузки в память
Отправлено: Bepec от Июль 26, 2012, 10:34
Так о том и речь идёт - долго сие, читать весь файл с перескакиванием :)

Получится простое чтение в память, не более или менее. Если элемент последний, то время ожидания будет ммм.. прикольным? :)


Название: Re: QFile поиск по файлу без его загрузки в память
Отправлено: virtual_root от Июль 26, 2012, 11:40
Ребята спасибо за ответы. А в файл я записываю следующую структуру:
Код
HTML
{
"2410": {
"ID": "2410",
"SORT": "110",
"NAME": "Джон Джоли",
"DATETIME": 1341836002,
"DESCRIPTION": " <!--&laquo;Джон Джоли&raquo; - демократичный ресторанчик кавказской кухни в самом центре Москвы. В меню преобладают знакомые с детства и любимые блюда грузинской кухни: всевозможные виды шашлыка, приготовленного на настоящем мангале, лепешки и лаваши, испеченные в тандыре, традиционные долма, хачапури, куч-мачи, легендарные разливные воды Лагидзе и многое другое. <br /> <br />--> Уютный и гостеприимный ресторан &quot;Джон Джоли&quot;расположен в самом центре Москвы. Добираться сюда из отдаленных районов Москвы, конечно, сложновато, но ничто не мешает вам сделать заказ на дом. Доставка из ресторана Джонджоли &mdash; это лучшие блюда кавказской кухни на вашем столе. Свежеиспеченные лепешки и лаваш станут отличным дополнением к люля-кебабу, шашлыкам из разного вида мяса и рыбе, запеченной на углях. Лобио и хачапури, кутабы и хинкали, куч-мачи и долма &mdash; вы уже чувствуете предвкушение от предстоящего застолья?",
"PICTURE": "/upload/iblock/a69/a6925a56242b8ca9efcd96a65e401a42.png",
"DETAIL_PICTURE": "/upload/iblock/17d/17d82bca8d49969df6552ca94384ba3f.png",
"AVERAGE_BILL": "1000",
"WORK_TIMES": "11:00 - 23:00",
"MIN_SUM": "1000",
"SHOW_FOR_IPHONE": "1",
"NETWORK": "Y",
"COOKERY_TYPES": "Кавказская",
"ADDRESS": "???????? 20/1||"
},-
"2899": {
"ID": "2899",
"SORT": "100",
"NAME": "Мама Тао",
"DATETIME": 1341836491,
"DESCRIPTION": "Мама Тао &ndash; это сеть демократичных китайских ресторанчиков, в которых можно приобщиться к уникальной восточно-азиатской кухне. Шеф-повар Ван Чуань Бао придирчиво следит за правильностью приготовления блюд по разработанному им обширному меню. Доставка из ресторана &quot;Мама&nbsp;Тао&quot; может включать в себя любые блюда из представленного нами ассортимента. Вы можете быть уверены, что в число ингредиентов не входят сверхострые соусы, крепкие приправы и экзотические составляющие, к которым не привычен вкус российского потребителя. Все блюда адаптированы в соответствии с нашими привычками, при этом национальный колорит и самобытность остаются неизменными. ",
"PICTURE": "/upload/iblock/a4b/a4bc3feceeb89feae2d46cc83a63794c.png",
"DETAIL_PICTURE": "/upload/iblock/41c/41c3ec2a5a684e9cefa0d4d83579d524.png",
"AVERAGE_BILL": "1000",
"WORK_TIMES": "11:00 - 22:40",
"MIN_SUM": "1000",
"SHOW_FOR_IPHONE": "1",
"NETWORK": "Y",
"COOKERY_TYPES": "Китайская",
"ADDRESS": "???? ??? ?????????|"
},-
"2900": {
"ID": "2900",
"SORT": "30",
"NAME": "Оки Доки",
"DATETIME": 1333451937,
"DESCRIPTION": "«Оки Доки» - новое имя на ресторанном рынке Москвы. Это современные демократичные заведения с интернациональным меню. Коротко концепция ресторана звучит так: «ОКИ ДОКИ - еда без границ». Здесь Вы и ваши друзья сможете попробовать блюда европейской, японской и русской кухни и прекрасно провести время в непринуждённой обстановке.",
"PICTURE": "/upload/iblock/3e8/3e89e52492f7b4f44f738a933ffa529e.png",
"DETAIL_PICTURE": "/upload/iblock/f9e/f9e0b9b7f769fe23f4a4b6297ce52812.png",
"AVERAGE_BILL": "800",
"WORK_TIMES": "00:00 - 23:59",
"MIN_SUM": "800",
"SHOW_FOR_IPHONE": "1",
"NETWORK": "Y",
"COOKERY_TYPES": "Японская|Европейская",
"ADDRESS": "????? ??????????? 20|??????????, 12|????????? ???, 2|??????????? ????????, 22|????????, 20"
},-
"2901": {
"ID": "2901",
"SORT": "40",
"NAME": "Песто",
"DATETIME": 1340985002,
"DESCRIPTION": "«Песто кафе» - это демократичные рестораны итальянской кухни. Меню разработал итальянский шеф-повар Андреа Дипино в&nbsp;&nbsp;лучших традициях семейных итальянских ресторанов. Большие порции, домашние рецепты и доступные цены – так можно коротко описать концепцию новой ресторанной сети.",
"PICTURE": "/upload/iblock/113/113978fe194ec5c2d67d6d9984892290.png",
"DETAIL_PICTURE": "/upload/iblock/957/957a1d17b803e8a0ca835ddcc026890e.png",
"AVERAGE_BILL": "1000",
"WORK_TIMES": "11:00 - 23:45",
"MIN_SUM": "800",
"SHOW_FOR_IPHONE": "1",
"NETWORK": "Y",
"COOKERY_TYPES": "Итальянская",
"ADDRESS": "||"
}-
}
Это ответ сервера, я пакую его в QList, QMap и записываю в файл.
Я привела не полный ответ. Но при работе я запрашиваю определенные блоки ответов от сервера и записываю их в соответствующие файлы: рестораны, меню, блюда.
А читаю я так: сначала мне нужно считать все рестораны и отобразить их на форме. Потом, когда пользователь выберет один из ресторанов мне нужно подгрузить  на форму меню этого ресторана. Каждый ресторан имеет идентификатор который совпадает с его списком меню. Поэтому я и хотела из файла меню прочитать только то меню  у которого идентификатор допустим 2901.


Название: Re: QFile поиск по файлу без его загрузки в память
Отправлено: kambala от Июль 26, 2012, 12:05
думаю стоит использовать базу данных


Название: Re: QFile поиск по файлу без его загрузки в память
Отправлено: _OLEGator_ от Июль 26, 2012, 12:19
Так бы сразу. Конечно надо использовать БД (SQLite например), все распарсить и разложить по таблицам.