|
|
|
|
|
для: Trianon
(22.03.2007 в 09:25)
| | Красава... Огромное Вам спасибо, Trianon ...
"Правильная" расстановка позиций указателя файла - то что надо...
Как отсортировать по куску получаемой строки, а не по всей... я сделаю))
Запись результата в файл думаю и будет что-то вроде кеша, лучше в поток на вывод с диапозоном (навигация). А если писать, то порядок позиций указателя...
Еще раз спасибо... | |
|
|
|
|
|
|
|
для: Yuri
(22.03.2007 в 05:27)
| | 40e6 /4e3 = 10 000 . Для массива это довольно скромный объем.
<?
function comparer($a, $b) // функция сравнения индексных элементов строк
{
global $f;
fseek($f, SEEK_SET, $a); $la = fgets($f);
fseek($f, SEEK_SET, $b); $lb = fgets($f);
return strcmp($la, $lb); //вместо strcmp подставить пользовательскую функцию сравнения записей
}
$f = fopen("file.txt", "rb");
for(;;) // читаем файл, строим индекс
{
$pos = ftell($f);
$line = fgets($f);
if(feof($f))
break;
$idx[] = $pos;
}
if($line != '')
$idx[] = $pos;
usort($idx, 'comparer'); // сортируем индекс
$fw = fopen("result.txt", "wb");
foreach($idx as $pos) // копируем результат в порядке индекса
{
fseek($f, SEEK_SET, $pos);
$line = fgets($f);
fputs($fw, $line);
}
fclose($f);fclose($fw);
|
Для быстроты можно еще написать кеш записей, но это уже украшательства над алгоритмом. | |
|
|
|
|
|
|
|
для: Trianon
(21.03.2007 в 23:43)
| | Строка на 4-10Кб | |
|
|
|
|
|
|
|
для: Yuri
(21.03.2007 в 21:08)
| | А сколько всего записей в файле? Может быть есть возможность создать кластерный индекс и отсортировать его стандартными средствами? После чего сделать вывод по порядку индекса. | |
|
|
|
|
|
|
|
для: Yuri
(21.03.2007 в 21:08)
| | Я так думаю, значит считывать кусками и записывать в файлы. Ну наделать файлов для каждой первой буквы например. Потом эти файлы опять считывать каждый в массив и сортировать. Но если на одну букву много будет начинаться - тоже может быть большой массив. Ну всеж поменьше. И с числами что-то такое тоже придумать. Ну это вам виднне, что там у вас за числа. | |
|
|
|
|
|
|
|
для: Trianon
(21.03.2007 в 20:59)
| | Согласен...
Если бы была возможность вопроса бы не было | |
|
|
|
|
|
|
|
для: Yuri
(21.03.2007 в 17:03)
| | Обычно для таких объемов применяются последовательные - внешние методы сортировки.
Лобовой метод ленточной сортировки требует четырехкратный объем файлового пространства. В принципе его можно реализовать и на php.
Хотя если бы у меня возникла такая практическая задача, я обратился бы именно к MySQL.
Сорок метров для него не объем, набросать скрипт импорта данных - дело пяти минут, получить отсортированный результат - еще быстрее. | |
|
|
|
|
|
|
| Уважаемые форумчане!
Столкнулся с такой дилеммой… сортировка результата по столбцам строк.
Имеется файл (к примеру) date.txt его размер больше 40Мб и это не придел.
Структура его строк: dat1::dat2::dat3::dat4::dat5
datN – число; строка;
Задача: выполнить сортировку по любому из datN
Само собой загонять весь файл в массив с последующей сортировкой массива, самый простой вариант, но с файлом в 40Мб и более это плохая практика.
А если считывать в цикле определенное кол-во строк, то сортировка коснется лишь диапазона, а не всей информации.
MySql рулит, но не та тема…
Чего делать, мозг кипит…
Заранее благодарен за помошь.. | |
|
|
|
|