Дерево в файле

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Дерево в файле

Сообщение Space » 25.03.2009 (Ср) 14:24

Данные организованы в виде дерева, вернее куста, т.е. вместо корня массив данных. В каком виде записать всё это дело в файл, чтобы читать было эффективно (держать куст в памяти не представляется возможным, базы данных не юзаю, т.к. предпочитаю прямое чтение из файлов и не хочу разбираться в структуре баз в случае нарушения целостности и восстановления баз). А ещё прикол весь в том, что значение каждого листка/ветки строка переменной длины...
Последний раз редактировалось Space 25.03.2009 (Ср) 14:30, всего редактировалось 1 раз.

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Re: Дерево в файле

Сообщение RayShade » 25.03.2009 (Ср) 14:25

XML
I don't understand. Sorry.

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Дерево в файле

Сообщение jangle » 25.03.2009 (Ср) 15:26

Обойти все листы/ветки начиная с корня, сформировать массив данных в виде совокупности вложенных PropertyBag (чтобы ничего не парсить), все это запихнуть в один PropertyBag и сохранить его на диск в виде бинарного файла.
При загрузке, все обратно извлечь и в цикле опять обойти дерево добавляя ноды и данные. Я бы написал код - но мне лень...

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Дерево в файле

Сообщение Хакер » 25.03.2009 (Ср) 15:50

Рэй, ты всюду XML будешь рекламировать, не читая, о чём просят? :)
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Re: Дерево в файле

Сообщение RayShade » 25.03.2009 (Ср) 16:02

Пока не придумали более эффективного не бинарного метода хранения древовидных структур, буду :)
I don't understand. Sorry.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Дерево в файле

Сообщение Хакер » 25.03.2009 (Ср) 16:14

Бинарность рулит в рамках данной задачи.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Re: Дерево в файле

Сообщение RayShade » 25.03.2009 (Ср) 16:19

Бинарность как мне кажется, отрицается автором топика :) Но в любом случае, XML's like a violence - if it doesn't solve all your problems you're simply not using enough of it :)
I don't understand. Sorry.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Дерево в файле

Сообщение Хакер » 25.03.2009 (Ср) 16:26

XML — классная вещь, но только не здесь.

Два недостатка текстовых форматов хранения данных: за маркеры формата могут приняты части хранимых данных, значит, надо обеспечить, чтобы в данных не встретилось ничего похожего на форматные маркеры. Способа сделать это так, чтобы хранимые данные не увеличились в размере, не существует.

Чтобы найти "конец данных", надо просканировать каждый символ этих данных.

Когда данные имеют такой размер, что не помещаются в памяти, это очень существуенные недостатки.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Re: Дерево в файле

Сообщение RayShade » 25.03.2009 (Ср) 16:42

Какие маркеры? :) О чем это ты? Единственная проблема, которая тут может быть - это объем :) Но все равно проще чем написать схему, засунуть данные в разметку из тегов и потом искать/читать/писать через DOM - врядли что то придумается.
I don't understand. Sorry.

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: Дерево в файле

Сообщение ANDLL » 25.03.2009 (Ср) 17:04

Действительно! DOM наше все! И зачем всякие идиоты придумывают SAX, для чтения того же XML?
И зачем придумывают двоичные аналоги? Что может быть проще - распарсить файл в модель и вынуть нужные ноды с помощью одного xpath'а. Ведь не бывает же файлов на диске размером больше чем ОЗУ компьютера, все то сказки будто бы DOM может не влезть в оперативку. Затолкают.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Дерево в файле

Сообщение Space » 25.03.2009 (Ср) 17:22

ANDLL писал(а): Ведь не бывает же файлов на диске размером больше чем ОЗУ компьютера
Бывает и ещё как. А даже и влезет в ОЗУ, мне жалко забивать ОЗУ таким объёмом данных. Да, если кто не понял, мне надо читать только 1 веточку с последовательным выбором "Страна-Область-Город..." Где бы ещё данные выкачать :)
Последний раз редактировалось Space 25.03.2009 (Ср) 17:28, всего редактировалось 1 раз.

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: Дерево в файле

Сообщение ANDLL » 25.03.2009 (Ср) 17:26

Space писал(а):
ANDLL писал(а): Ведь не бывает же файлов на диске размером больше чем ОЗУ компьютера
Бывает и ещё как.

Так, добро пожаловать страну сарказма
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Дерево в файле

Сообщение Space » 25.03.2009 (Ср) 17:31

ANDLL, у меня ОЗУ 512Мб, а файлы бывают под 2Гб. А бывает ОЗУ и меньше. Читай также правку предыдущего поста.

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: Дерево в файле

Сообщение ANDLL » 25.03.2009 (Ср) 17:38

Госпаде, space, ну и туго же до вас доходит этим утром
На, читай: http://ru.wikipedia.org/wiki/%D0%A1%D0% ... 0%B7%D0%BC
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Дерево в файле

Сообщение Space » 25.03.2009 (Ср) 17:55

о, у вас ещё утро :)

Zenitchik
Постоялец
Постоялец
 
Сообщения: 369
Зарегистрирован: 21.12.2006 (Чт) 14:48

Re: Дерево в файле

Сообщение Zenitchik » 25.03.2009 (Ср) 19:56

Я использую формат скобок и запятых (LISP-подобный), с возможностью их экранирования бэкслешем. Но, полагаю, здесь это не подходит.
Еще я как-то раз хранил древовидные данные в виде многоуровневого списка, где глубина вложения определялась числом пробелов вначале строки (была задача обеспечить в случае нужды читаемость файла через блокнот)

Стоп. Нужен именно двоичный алгоритм... Дерево - суть ацикличный орграф. Если сделать записи вида
(Адрес родителя, Адрес первого потомка, Адрес следующего на уровне, Длина содержимого, Содержимое)
Знание английского языка - затрудняет понимание кода

Александр Дмитриев
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 296
Зарегистрирован: 05.01.2005 (Ср) 3:39
Откуда: Санкт-Петербург    Куда: /dev/null

Re: Дерево в файле

Сообщение Александр Дмитриев » 26.03.2009 (Чт) 18:48

Zenitchik писал(а):Дерево - суть ацикличный орграф.
Связный ациклический граф. Хотя здесь, по-моему, связности нет, ацикличность проверять долго и не нужно, да и граф не граф, а орграф :)

А что если использовать чанки? По-моему, здесь подойдут чанки с таким заголовком: длина чанка, длина содержимого непосредственно самого чанка, далее непосредственное содержимое чанка, далее сабчанки.

Zenitchik писал(а):(Адрес родителя, Адрес первого потомка, Адрес следующего на уровне, Длина содержимого, Содержимое)
А ведь адрес следующего на уровне может быть вычислен через длину содержимого.

Space А данные велики из-за размеров элементов дерева или из-за кол-ва элементов?

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Дерево в файле

Сообщение Space » 26.03.2009 (Чт) 19:28

ну смотри: выбираем Страну -> массив областей Страны -> массив Городов области...

Александр Дмитриев
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 296
Зарегистрирован: 05.01.2005 (Ср) 3:39
Откуда: Санкт-Петербург    Куда: /dev/null

Re: Дерево в файле

Сообщение Александр Дмитриев » 26.03.2009 (Чт) 19:41

То есть средний размер элемента дерева 10-15 символов, а элементов вплоть до сот миллионов и больше? (По-моему только так могут получится Гб)

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Дерево в файле

Сообщение Space » 26.03.2009 (Чт) 20:47

ну не знаю, но чувтвую одним местом, будет очень много. Я ещё не выкачал списки, ищу...

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Дерево в файле

Сообщение iGrok » 26.03.2009 (Чт) 21:14

Space писал(а):ну не знаю, но чувтвую одним местом, будет очень много. Я ещё не выкачал списки, ищу...

Вообще, бинарная бд GeoIP со странами весит метр. С регионами - около 5 метров что ли.. С городами, кажись метров 30.. Понятное дело, там далеко не всё.. Но тем не менее.

Вот импортированная в аксесс - да. 300 метров. Но у аксесса избыточность данных поистине безумная. )

Так что кажется мне, до гигабайта ты не дотянешь.
label:
cli
jmp label

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Дерево в файле

Сообщение alibek » 26.03.2009 (Чт) 21:27

iGrok писал(а):Так что кажется мне, до гигабайта ты не дотянешь.

А какая связь?
Гигабайт, если что, это миллиард, а не миллион.
Lasciate ogni speranza, voi ch'entrate.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Дерево в файле

Сообщение iGrok » 26.03.2009 (Чт) 21:38

alibek писал(а):Гигабайт, если что, это миллиард, а не миллион.

Я в курсе. )

Ну, как, какая связь? У него же БД стран/регионов/городов/и т.п.. А GeoIP это что такое?

Нет, я не забыл, что у него там ещё какая-то информация помимо просто названий городов. Ну так и разница между гигабайтом и 30 мегабайтами несколько.. Как бы это сказать.. Существенная, что ли? )

Мне думается, там суммарный объём всё-таки будет существенно меньше гигабайта.
label:
cli
jmp label

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Дерево в файле

Сообщение Space » 26.03.2009 (Чт) 21:47

30 Метров в распакованном виде? А мне и 30 метров памяти жалко :) Я всё равно буду держать в файле и читать оттуда только нужное, тем более, чтение совсем не частое.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Дерево в файле

Сообщение iGrok » 26.03.2009 (Чт) 22:01

Space писал(а):30 Метров в распакованном виде? А мне и 30 метров памяти жалко :) Я всё равно буду держать в файле и читать оттуда только нужное, тем более, чтение совсем не частое.

Да.. 27883К. Только что посмотрел. Судя по внутренностям APIшки для работы с нею - она не жатая.. Правда, текста в чистом виде я внутри не нашёл.
Так что хрен её. Я особо не копался..

Но насчёт целесообразности - полностью согласен. Лучше грузить что-то типа индекса (или корень) в память, а потом вытаскивать ветки куста по необходимости..

Тут есть ещё момент. Тебе нужна возможность легко, быстро и просто изменять содержимое, или там в будут статические данные, обновляемые крайне редко?
label:
cli
jmp label

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Дерево в файле

Сообщение Space » 26.03.2009 (Чт) 22:27

ну будет возможность добавлять новые значения и удалять их. Эта фишка будет происходить реже чтения данных. Весь упор на быстрое чтение нужной ветки (это не бинарное дерево), не колбася весь файл, или читая его полностью в память. Неожиданно возникла идея - держать основное дерево как статические данные(если для статического дерева есть крутой вариант), а новые записи(их будет немного) - добавление/удаление, юзать в INI...

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Дерево в файле

Сообщение iGrok » 26.03.2009 (Чт) 22:43

Space писал(а):ну будет возможность добавлять новые значения и удалять их. Эта фишка будет происходить реже чтения данных. Весь упор на быстрое чтение нужной ветки (это не бинарное дерево), не колбася весь файл, или читая его полностью в память. Неожиданно возникла идея - держать основное дерево как статические данные, а новые записи(их будет немного) - добавление/удаление, юзать в INI...


Ну отгда вариант с chunk'ами, предложенный Александром Дмитриевым весьма неплох..
Стран у нас не очень много - это будут корневые записи, потом регионы - сабчанки в странах, города - сабчанки в регионах, и т.п.
Если читаться в основном будут именно все значения категории (выбрали страну - показали все подходящие регионы, выбрали регион - показали все подходящие города, и т.п.) тогда это действительно удобно, и реально быстро. В принципе, даже изменять файл такого формата не очень сложно, ибо все значения относительные, все указатели вычисляются исходя из размеров чанков.. Т.е. при изменении значения просто сдвигаем остаток файла на нужное место, после чего проходимся вверх до корня, правя размеры чанков.

Очень неудобным будет обратный поиск - в каком регионе находится конкретный город - придётся перебирать ВЕСЬ файл, или строить дополнительный индекс.
label:
cli
jmp label

Zenitchik
Постоялец
Постоялец
 
Сообщения: 369
Зарегистрирован: 21.12.2006 (Чт) 14:48

Re: Дерево в файле

Сообщение Zenitchik » 27.03.2009 (Пт) 0:26

Код: Выделить всё
может быть вычислен через длину содержимого

А где гарантия, что они идут последовательно?
Знание английского языка - затрудняет понимание кода

Александр Дмитриев
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 296
Зарегистрирован: 05.01.2005 (Ср) 3:39
Откуда: Санкт-Петербург    Куда: /dev/null

Re: Дерево в файле

Сообщение Александр Дмитриев » 27.03.2009 (Пт) 0:42

Ну можно их расположить поледовательно. Но впрочем ты прав: если располагать непоследовательно, появляется также возможность эффективно добавлять/удалять. Да, твой вариант лучше.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 41

    TopList  
cron