Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: Сортировка результата большого файла

Сообщения:  [1-8] 

 
 автор: Yuri   (22.03.2007 в 12:26)   письмо автору
 
   для: Trianon   (22.03.2007 в 09:25)
 

Красава... Огромное Вам спасибо, Trianon ...
"Правильная" расстановка позиций указателя файла - то что надо...
Как отсортировать по куску получаемой строки, а не по всей... я сделаю))
Запись результата в файл думаю и будет что-то вроде кеша, лучше в поток на вывод с диапозоном (навигация). А если писать, то порядок позиций указателя...
Еще раз спасибо...

   
 
 автор: Trianon   (22.03.2007 в 09:25)   письмо автору
 
   для: Yuri   (22.03.2007 в 05:27)
 

40e6 /4e3 = 10 000 . Для массива это довольно скромный объем.

<?
function comparer($a$b// функция сравнения индексных элементов строк 
{
    global 
$f;
    
fseek($fSEEK_SET$a);    $la fgets($f);
    
fseek($fSEEK_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($fSEEK_SET$pos);
    
$line fgets($f);
    
fputs($fw$line);
}
fclose($f);fclose($fw);

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

   
 
 автор: Yuri   (22.03.2007 в 05:27)   письмо автору
 
   для: Trianon   (21.03.2007 в 23:43)
 

Строка на 4-10Кб

   
 
 автор: Trianon   (21.03.2007 в 23:43)   письмо автору
 
   для: Yuri   (21.03.2007 в 21:08)
 

А сколько всего записей в файле? Может быть есть возможность создать кластерный индекс и отсортировать его стандартными средствами? После чего сделать вывод по порядку индекса.

   
 
 автор: dim0s   (21.03.2007 в 23:03)   письмо автору
 
   для: Yuri   (21.03.2007 в 21:08)
 

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

   
 
 автор: Yuri   (21.03.2007 в 21:08)   письмо автору
 
   для: Trianon   (21.03.2007 в 20:59)
 

Согласен...
Если бы была возможность вопроса бы не было

   
 
 автор: Trianon   (21.03.2007 в 20:59)   письмо автору
 
   для: Yuri   (21.03.2007 в 17:03)
 

Обычно для таких объемов применяются последовательные - внешние методы сортировки.
Лобовой метод ленточной сортировки требует четырехкратный объем файлового пространства. В принципе его можно реализовать и на php.

Хотя если бы у меня возникла такая практическая задача, я обратился бы именно к MySQL.
Сорок метров для него не объем, набросать скрипт импорта данных - дело пяти минут, получить отсортированный результат - еще быстрее.

   
 
 автор: Yuri   (21.03.2007 в 17:03)   письмо автору
 
 

Уважаемые форумчане!
Столкнулся с такой дилеммой… сортировка результата по столбцам строк.
Имеется файл (к примеру) date.txt его размер больше 40Мб и это не придел.
Структура его строк: dat1::dat2::dat3::dat4::dat5
datN – число; строка;
Задача: выполнить сортировку по любому из datN

Само собой загонять весь файл в массив с последующей сортировкой массива, самый простой вариант, но с файлом в 40Мб и более это плохая практика.
А если считывать в цикле определенное кол-во строк, то сортировка коснется лишь диапазона, а не всей информации.

MySql рулит, но не та тема…

Чего делать, мозг кипит…

Заранее благодарен за помошь..

   

Сообщения:  [1-8] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования