LINUX.ORG.RU

Большое количество данных и мало ресурсов


0

0

Есть такая задача: существуют категории(порядка тысячи), одна категоря может принадлежать другое, то есть у нас дерево-подобная структура. В категории может элемент(элементов порядка миллиона), причём он может быть в разных категориях. У элемента есть какие-то поля, их ~10, у категории только имя. Что нужно делать с этой структурой данных: найти все элементы данных категорий, найти элементы по значению поля.

Сейчас это сделано на python+sqlite, но скорости явно не достаточно(должно работать всё на слабой платформе). Так вот посоветуйте , пожалуйста,с помощью чего рациональнее всего решить данную задачу.

Спасибо.

anonymous

1. заменить python на С

2. Если скорости всё ещё недостаточно, то когда утресётся структура базы, sqlite заменяется на db4, муторно конечно, зато если сделать аккуратно будет работать как из пулемёта.

p.s. "должно работать на слабой платформе" и модный интерпретатор - вещи несовместимые :)

MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

>p.s. "должно работать на слабой платформе" и модный интерпретатор - вещи несовместимые :)

Переписал на с++ и qt4 - работа с БД это просто писец:((((( Проход по 100.000 записям занимает 3 секунды на не самой слабой системе. Проблема скорее всего в sqlite, тк доступ к элементу последовательный(sqlite3_step).

anonymous
()
Ответ на: комментарий от anonymous

> Проход по 100.000 записям занимает..

покажите-ка структуру БД, а то странные какие-то проходы :) и расскажите как вы с ней работаете - а то создаётся впечатление, что запросами которые выдёргивают/затрагивают чуть не всю базу..

MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

queryString="SELECT id,name,parentId FROM Item";
if(query.exec(queryString)==false){
qDebug()<<"db error"<< query.lastError ().driverText() << query.lastError ().databaseText () << queryString;
}
while (query.next()) {
temp.setType(MBItem::Song);
temp.setName(query.value(1).toString());
temp.setId(query.value(0).toInt());
temp.setParent(query.value(6).toInt());
all_items.insert(temp.getId(),temp);
}

Размер таблицы Item порядка сотни тысяч, время выполнения этого кода ~3 секунды:(((

anonymous
()
Ответ на: комментарий от anonymous

db4, насколько я понял, просто хранит данные, но не управляет ими. То есть СУБД надо самому делать

krum
()
Ответ на: комментарий от anonymous

<cite>
queryString="SELECT id,name,parentId FROM Item";
if(query.exec(queryString)==false){
qDebug()<<"db error"<< query.lastError ().driverText() << query.lastError ().databaseText () << queryString;
}
while (query.next()) {
temp.setType(MBItem::Song);
temp.setName(query.value(1).toString());
temp.setId(query.value(0).toInt());
temp.setParent(query.value(6).toInt());
all_items.insert(temp.getId(),temp);
}
Размер таблицы Item порядка сотни тысяч, время выполнения этого кода ~3 секунды:(((
</cite>

и зачем вам SQL ? если вы всё равно ВСЮ базу пихаете куда-то в память..
недостаток скорости в данном случае вызван непродуманностью
программы, а не средствами реализации..

вообще приведённый пример - это просто комплимент для sqlite

MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

Если нужно показать всё содержимое базы? На каждое событие скролла генерировать запрос к базе?

anonymous
()
Ответ на: комментарий от anonymous

Выкручивайтесь :-)

если делать по вашему, то если запись в среднем 64 байта, а всего их 200000 то придётся в память пихать где-то мегов 12-15, что уже противоречит требованию "малых ресурсов".. плюс к этому ГУЙ со скроллом..

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

сортируйте по алфавиту и делайте выборки по первому символу, или по какому-нить другому признаку. У вас же есть категории ? вот по ним и выбирайте.

MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

Вот уже думаю так делать: вибирать по немного из БД для показа. Щас посмотрю, сколько времени займёт запрос, если приемлемое время, то так и оставлю.

anonymous
()
Ответ на: комментарий от MKuznetsov

1. Ты бы ещё более глупый совет дал, было бы совсем смешно. Но так тоже ничё, я поржал.

2. Заменить на PostgreSQL. Он оптимиздит запросы гораздо умнее чем SQLite.

P.S. Глупости глаголишь. Интерпретатор тут ни разу не слабое звено. Даже если в 1000 раз быстрее работать будет, разница на глаз не должна быть заметна.

P.P.S. В каком заведении готовят таких "программистов", как ты, гр. Кузнецов? Чисто чтоб знать, с кем ни при каких обстоятельствах нельзя связываться.

Abnormal
()

Есть хороший способ представления дерева в БД: использовать текстовое поле для сортировки. Тогда любая ветка дерева извлекается одним запросом, типа sort > "AAAAABCD" and sort < "AAAAAC".

Как отсортировать существующее дерево, и как сделать быструю вставку и удаление элементов и веток - сам догадаешься, если ты хотя бы немного умнее отметившегося тут Кузнецова.

Abnormal
()

мож тебе надо твоё дерево отобразить на файловую систему, а элементы на файлы??

принадлежность елемента к разным категориям реализовать симлинками??

cvv ★★★★★
()
Ответ на: комментарий от anonymous

То есть, корень - это A, потомки - AA,AB,AC и тд,потомки их потомков AAA, AAB,ABA и тд? Я правильно понял?

anonymous
()
Ответ на: комментарий от cvv

>мож тебе надо твоё дерево отобразить на файловую систему, а элементы >на файлы?? >принадлежность елемента к разным категориям реализовать симлинками??

И какая ФС выдкржит ТАКОЕ издевательво? Помню в бытность моей работы на хостинге, один герой так сделал, у него было порядка миллиона файлов, в каждой папке примерно 5 файлов по 100 байт. Он ещё удивлялся, почему тормозит:)) ФС была UFS на FreeBsd5.3

anonymous
()
Ответ на: комментарий от anonymous

Заодно, может есть у кого в цифровом виде SQL for Smarties J. Celco? Там вроде по этой теме много написано.

anonymous
()
Ответ на: комментарий от anonymous

> Postgres конечно хорошо, но это пушкой по воробьям:)

Тебе шашечки или ехать?

SQLite так быстро работать не будет на твоих запросах.

Abnormal
()
Ответ на: комментарий от anonymous

Примерно так. Только надо ещё оставлять место для вставки новых элементов.

Abnormal
()
Ответ на: комментарий от anonymous

>И какая ФС выдкржит ТАКОЕ издевательво?

нормальная. Это не издевательство, если ось не win и fs не ntfs или рейзер. я предполагал ext2 под линукс.

а почему тормозил UFS на FreeBsd5.3 спроси в толках, там расскажут, хотя мож у него ещё и руки кривые были

cvv ★★★★★
()
Ответ на: комментарий от Abnormal

на c++ прога стала работать в 15 раз быстрее:)) А добавление индексов в базу увеличело её скорость ещё в 2 раза

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.