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

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

-~{}~ 06.08.09 15:00:

Ну это я лукавлю, Иногда и всю ночь работает, и там не далеко 500 строчек, иногда и весь этот миллион в разной последовательности нужен. 500 строчек вытащит за секунд 20
 
Видишь ли какое дело.
Если я сейчас все брошу и напишу тест, то у меня выборка 500 строк по твоему алгоритму займет в сто раз меньше времени.
То есть, проблема, выходит, не в том, что ты озвучил, а в том, о чем умолчал.
 
А по поводу поля, тогда зачем нужны разные типы данных text mediumtext longtext, если от этого разницы нет никакой для базы данных. Все таки по моему она разрастается

-~{}~ 06.08.09 15:05:

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

-~{}~ 06.08.09 15:07:

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

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

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

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

п.с. раз у теб центос 4, то сделай yum install mysql-server и он тебе на выбор предложит ставить 4-ю или 5-ю ветки, обе доступны в репозитарии.
 
реальную задачу я написал
читаем:
нужно за раз вытащить 200-500 строчек
за раз нужно выдать несколько тысяч строк
иногда и весь этот миллион
А в остальном, прекрасная маркиза, все описал, все описал.

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

-~{}~ 06.08.09 15:22:

и проблема уже не в чтении индекса, а в том, что он изначально все делал правильно, но сам объем задачи в разы больше, чем было заявлено. Вообще, это тот случай, когда надо конкретно профайлить, а не искать волшебную пулю.
 
Ребята не судите меня строго, я понимаю свою ошибку, и что я вам мозги запудрил своей задачей.
Надо было сразу усложнить задачу и сказать, что есть файл с миллионом строк, нужно в разной последовательности вытащить каждую из этих строк. Чтобы вас не запутывать например случайным образом весь миллион.
Поможет ли в этом мне 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 я конечно не подключал это самоубийство для сервера.
 
задача сделать сортировку миллиона записей? в общей постановке это маразм и тормозить будет при любых раскладах, хоть с БД хоть без нее.

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

мой /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
 
dimagolov, откуда ты взял про сортировку?

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

страх запутать нас - это невозможность сформулировать задачу из-за ее непонимания самим ТС
 
разную последовательность сложно назвать сортировкой
именно "разная последовательность" и задает порядок сортировки. критерием сортировки ведь не обязательно лексикографический порядок значений может быть, еще и произвольный внешний ключ, который задает порядок.
 
Ф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 тысяч строк в секунду (случайный выборка)

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