Алгоритм работы с большим файлом базы данных

Статус
В этой теме нельзя размещать новые ответы.

dimagradov

Новичок
Ну я уже вас не стал грузить сложностью программы) будем считать, что программа знает, что сейчас ей нужна последовательность из например таких строк 4б,43565,57876,23434,5646 и т.д.

-~{}~ 06.08.09 15:00:

Ну это я лукавлю, Иногда и всю ночь работает, и там не далеко 500 строчек, иногда и весь этот миллион в разной последовательности нужен. 500 строчек вытащит за секунд 20
 

Фанат

oncle terrible
Команда форума
Видишь ли какое дело.
Если я сейчас все брошу и напишу тест, то у меня выборка 500 строк по твоему алгоритму займет в сто раз меньше времени.
То есть, проблема, выходит, не в том, что ты озвучил, а в том, о чем умолчал.
 

dimagradov

Новичок
А по поводу поля, тогда зачем нужны разные типы данных text mediumtext longtext, если от этого разницы нет никакой для базы данных. Все таки по моему она разрастается

-~{}~ 06.08.09 15:05:

Автор оригинала: *****
Видишь ли какое дело.
Если я сейчас все брошу и напишу тест, то у меня выборка 500 строк по твоему алгоритму займет в сто раз меньше времени.
То есть, проблема, выходит, не в том, что ты озвучил, а в том, о чем умолчал.
Так прога-то не только вытаскивает строчку, она еще и потом работает с ней, прога очень сложная, зачем вас этим грузить. Но с винтом при этом она точно не работает, а все делает в оперативке.
По моему я вас всех перегрузил своей проблемой, я-то наделялся, просто покажете мне функцию, которую я просто не знаю, для простой работой с файлом, или просто скажите как файл оптимизировать, чтобы сразу раз и вытащить нужную строку)
 

Фанат

oncle terrible
Команда форума
Получается, мы две страницы разговаривали ни о чем. Потому что кто-то лукавил, проявлял заботу, и в целом писал о чем угодно, только не о реальной задаче.

-~{}~ 06.08.09 15:07:

dimagradov
есть простой способ копать песок?
 

dimagradov

Новичок
Автор оригинала: *****
Получается, мы две страницы разговаривали ни о чем. Потому что кто-то лукавил, проявлял заботу, и в целом писал о чем угодно, только не о реальной задаче.
Вы не правы, реальную задачу я написал, вы вроде бы ответили, что без БД никак не обойтись, сейчас буду думать о возможности подключения БД.
Не судите строго.
Спасибо
 

Фанат

oncle terrible
Команда форума
Мне надо: лепить куличики, копать сортир, рыть траншею под кабель 2 километра, стрроить искусственный пляж.
Подскажи мне единый универсальный инструмент для решения всех этих проблем. Это ведь несложно, правда? Ведь во всех случаях мне надо копать песок.

Давай - подскажи мне "функцию для простой работы с файлом"?
 

Фанат

oncle terrible
Команда форума
, сейчас буду думать о возможности подключения БД.
Обломись. База данных - не волшебник с изумрудного города. И если тебе надо получать по 200 байт из двух гигов в разброску, то база тебе их не родит на блюдечке за пол-секунды.
 

dimagolov

Новичок
dimagradov, ограничение на тип данных в БД накладывает не общий размер, а размер одной записи, то есть максимальная длинна строки.

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

у тебя индекс текстовый, в котором в десятичном представлении записаны построчно смещения строк в основном файле? если индекс сделать из 4-х байтных записей, то чтобы узнать значение индекса не нужно будет весь индексный файл, достаточно будет номер строки умножить на 4 и прочитать 4 байта по полученному смещению.

п.с. раз у теб центос 4, то сделай yum install mysql-server и он тебе на выбор предложит ставить 4-ю или 5-ю ветки, обе доступны в репозитарии.
 

Фанат

oncle terrible
Команда форума
реальную задачу я написал
читаем:
нужно за раз вытащить 200-500 строчек
за раз нужно выдать несколько тысяч строк
иногда и весь этот миллион
А в остальном, прекрасная маркиза, все описал, все описал.

dimagolov, он боится, что строки отпадятся под размер поля и база вырастет. вот он о чем

-~{}~ 06.08.09 15:22:

и проблема уже не в чтении индекса, а в том, что он изначально все делал правильно, но сам объем задачи в разы больше, чем было заявлено. Вообще, это тот случай, когда надо конкретно профайлить, а не искать волшебную пулю.
 

dimagradov

Новичок
Ребята не судите меня строго, я понимаю свою ошибку, и что я вам мозги запудрил своей задачей.
Надо было сразу усложнить задачу и сказать, что есть файл с миллионом строк, нужно в разной последовательности вытащить каждую из этих строк. Чтобы вас не запутывать например случайным образом весь миллион.
Поможет ли в этом мне mysql? или также будет тормозить, как и с индексным файлом, который я в виде массива загоняю в оперативку это где-то 20-30 секунд. А потом при извлечении миллиона строк случайным образом винт сильно тормозит.
Если бы у меня было много оперативки, то я бы все 2 гигобайта загнал бы в массив и мгновенно выдавал любую строку.
Винт насилуется, когда через fseek меняется позиция в файле, например из начала файла в конец

п.с. раз у теб центос 4, то сделай yum install mysql-server и он тебе на выбор предложит ставить 4-ю или 5-ю ветки, обе доступны в репозитарии.
Мой сервер находится на theplanet.com


yum install mysql-server
Setting up Install Process
Setting up repositories
update 100% |=========================| 951 B 00:00
base 100% |=========================| 1.1 kB 00:00
addons 100% |=========================| 951 B 00:00
extras 100% |=========================| 1.1 kB 00:00
Reading repository metadata in from local files
Parsing package install arguments
Nothing to do

yum search mysql | grep server | grep i386
mysql-server.i386 4.1.22-2.el4 base
mysql-server.i386 4.1.22-2.el4 installed
Возможно у меня не все репозитарии подключены, репозитарии из Centos-5 я конечно не подключал это самоубийство для сервера.
 

dimagolov

Новичок
задача сделать сортировку миллиона записей? в общей постановке это маразм и тормозить будет при любых раскладах, хоть с БД хоть без нее.

поэтому задам вопрос зачем их (весь миллион) надо сортировать? что потом с результатом сортировки происходит?

мой /etc/yum.repos.d/CentOS-Base.repo
Код:
[base]
name=CentOS-$releasever - Base
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-centos4
priority=1
protect=1
[update]
name=CentOS-$releasever - Updates
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-centos4
priority=1
protect=1
[addons]
name=CentOS-$releasever - Addons
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=addons
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-centos4
priority=1
protect=1
[extras]
name=CentOS-$releasever - Extras
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-centos4
priority=1
protect=1
[centosplus]
name=CentOS-$releasever - Plus
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus
gpgcheck=1
enabled=0
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-centos4
priority=2
protect=1
[contrib]
name=CentOS-$releasever - Contrib
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=contrib
gpgcheck=1
enabled=0
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-centos4
priority=2
protect=1
 

Фанат

oncle terrible
Команда форума
dimagolov, откуда ты взял про сортировку?

Но вообще да, без описания реальной задачи это будет бесполезная трата времени.
 

dimagolov

Новичок
*****, сортировку я взял отсюда:
Надо было сразу усложнить задачу и сказать, что есть файл с миллионом строк, нужно в разной последовательности вытащить каждую из этих строк. Чтобы вас не запутывать например случайным образом весь миллион.
как еще это можно назвать, если не сортировкой?
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
разную последовательность сложно назвать сортировкой

страх запутать нас - это невозможность сформулировать задачу из-за ее непонимания самим ТС
 

dimagolov

Новичок
разную последовательность сложно назвать сортировкой
именно "разная последовательность" и задает порядок сортировки. критерием сортировки ведь не обязательно лексикографический порядок значений может быть, еще и произвольный внешний ключ, который задает порядок.
 

vovanium

Новичок
Фaнат
Видишь не успел закрыть ту тему, как появился другой чел с похожим вопросом ;)

dimagradov
Нет, индексный я в массив запихиваю и все
Сделай нормальный индексный файл, типизированный, а не массивы (конечно тормоза будут, если 28 метров в массив загонять постоянно), где будут храниться смещения каждой строки в виде 4 байт, тогда ты сможешь почти мгновенно выбирать данные.
И потом для выборки случайного действия нужно
PHP:
fseek($fi, rand(0, $elems - 1) * 4);  // Смещение к случайному элементу 
$tmp = unpack("Nint", fread($fi, 4)); // Читаем смещение строки для случайного элемента 
fseek($fm, $tmp['int']);                // Смещение к искомой строке 
$str = fgets($fm);                    // Читаем строку
где $fi - файл индекса, а $fm - файл с данными

Тестил на файле 99 МБ, 70+ тысяч записей, выбирает со скоростью около 60 тысяч строк в секунду (случайный выборка)

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