Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Закрытая темаСоздание новой темы Создание опроса
> Чтение/редактирование огромного файла на php, оптимизация и минимизация затрат ресурса 
:(
    Опции темы
Zmiuko
  Дата 4.3.2010, 06:54 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


http://zmiuko.ru
**


Профиль
Группа: Участник
Сообщений: 297
Регистрация: 8.10.2008

Репутация: 2
Всего: 2



Цитата(smartov @  3.3.2010,  20:27 Найти цитируемый пост)
Zmiuko, на stackoverflow подсказывают что если уж вы зажаты в рамки поставленной задачи, то можно воспользоваться вызовом стандартных UNIX утилит типа sed. 


Благодарю, очень доброе решение. Правда иногда не вполне осуществимо, но это малое что из реально продуманных ответов на поставленую задачу.

Цитата(Ипатьев @  3.3.2010,  20:42 Найти цитируемый пост)
что должны выдержать апач и пхп?

Любой программист, даже далеко не веб, должен иметь понятие не столько об используемый командах в интерпретаторе (поскольку справку всегда можно прочесть), сколько в известных ошибках выдаваемыми используемым продуктом. Не думаю, что Вы не поняли о каких именно ошибках и проблемах шла речь. Если действительно в недоумении, то создайте файл в миллион строк и попробуйте вывести постранично строки (пять строк на страницу к примеру), дабы понять какая ошибка выведет сам апач, то думаю вам дополнительно необходимо к каждой строке применить строковые функции, либо к каждой, либо как к массиву. В первом случае себя покажет интерпретатор, а во втором сам апач. Думаю, с постановкой данной задачи справитесь.
PM MAIL WWW ICQ Skype Jabber   Вверх
gcc
Дата 4.3.2010, 08:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: -1
Всего: 17



Zmiuko, для записи  http://ua.php.net/manual/en/function.fwrite.php  

?? 

Это сообщение отредактировал(а) gcc - 4.3.2010, 08:36
PM WWW ICQ Skype GTalk Jabber   Вверх
awers
Дата 4.3.2010, 08:10 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1465
Регистрация: 22.3.2006
Где: Россия, Таганрог

Репутация: 21
Всего: 31



Цитата(Zmiuko @  4.3.2010,  07:54 Найти цитируемый пост)
Любой программист, даже далеко не веб, должен иметь понятие не столько об используемый командах в интерпретаторе (поскольку справку всегда можно прочесть), сколько в известных ошибках выдаваемыми используемым продуктом. Не думаю, что Вы не поняли о каких именно ошибках и проблемах шла речь. Если действительно в недоумении, то создайте файл в миллион строк и попробуйте вывести постранично строки (пять строк на страницу к примеру), дабы понять какая ошибка выведет сам апач, то думаю вам дополнительно необходимо к каждой строке применить строковые функции, либо к каждой, либо как к массиву. В первом случае себя покажет интерпретатор, а во втором сам апач. Думаю, с постановкой данной задачи справитесь. 

На мой взгляд такая задача - бред в кубе. Я сделаю insert into .... а потом select * where ...  а потом ещё что нить и это займёт ~ 0.0002 секунды. Что за изобретения - мне непонятно.
PM MAIL WWW ICQ Skype   Вверх
Zmiuko
Дата 4.3.2010, 10:01 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


http://zmiuko.ru
**


Профиль
Группа: Участник
Сообщений: 297
Регистрация: 8.10.2008

Репутация: 2
Всего: 2



Почему бред? Нормальный вопрос, пускай он и не используется.  При чем тут " insert into .... а потом select * where" ? Мы же про файл говорим.

Цитата(gcc @  4.3.2010,  08:00 Найти цитируемый пост)
Zmiuko, для записи  http://ua.php.net/manual/en/function.fwrite.php  


Ну да, в курсе smile

PM MAIL WWW ICQ Skype Jabber   Вверх
awers
Дата 4.3.2010, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1465
Регистрация: 22.3.2006
Где: Россия, Таганрог

Репутация: 21
Всего: 31



Zmiuko, один раз распарсить в бд и юзать на здоровье.
PM MAIL WWW ICQ Skype   Вверх
sTa1kEr
Дата 4.3.2010, 15:24 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 56
Всего: 146



Цитата(smartov @  3.3.2010,  21:27 Найти цитируемый пост)
Zmiuko, на stackoverflow подсказывают что если уж вы зажаты в рамки поставленной задачи, то можно воспользоваться вызовом стандартных UNIX утилит типа sed. 

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

И тот же посоветованный sed здесь не исключение. Для редактирования файла он все так же читает его целиком поблочно и так же  целиком записывает в новый временный файл. 

Впрочем, что бы в этом убедится самим и наглядно увидеть алгоритм работы sed'а можно провести небольшой тест:

Создадим текстовый файл с 1 000 000 строк
Код

$ for i in {1..1000000}; do echo $i >> 1.txt; done


И при помощи утилиты strace посмотрим как sed будет его редактировать:
Код

$ strace sed -ri 's/476345/edited line/' 1.txt >strace.log 2>&1


Теперь смотрим, что у нас получилось :
Код

...
open("1.txt", O_RDONLY)                 = 3 // Открыли редактируемый файл для чтения
open("./sedBGgCPj", O_RDWR|O_CREAT|O_EXCL, 0600) = 4 // Открыли временный файл для записи
read(3, "1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14"..., 4096) = 4096 // Прочитали первый блок, 4096 байт
write(4, "1\n", 2)                      = 2 // Записали во временный файл первую строку
write(4, "2\n", 2)                      = 2 // Записали во временный файл вторую строку
write(4, "3\n", 2)                      = 2 // Записали во временный файл третью строку
...
write(4, "1040\n", 5)                   = 5 // И так до тех пор, пока не кончились данные из первого блока 
read(3, "1\n1042\n1043\n1044\n1045\n1046\n1047\n"..., 4096) = 4096 // Затем прочитали следующий блок
write(4, "1041\n", 5)                   = 5 // И понеслась...
write(4, "1042\n", 5)                   = 5
write(4, "1043\n", 5)                   = 5
...
write(4, "476343\n", 7)                 = 7
write(4, "476344\n", 7)                 = 7
write(4, "edited line\n", 14)         = 14 // Пока наконец в одном из блоков не нашли и не заменили искомую строку
write(4, "476346\n", 7)                 = 7 // Продолжаем читать блоки и писать их во временный файл...
write(4, "476347\n", 7)                 = 7
...
write(4, "999998\n", 7)                 = 7
write(4, "999999\n", 7)                 = 7
write(4, "1000000\n", 8)                = 8
read(3, "", 4096)                       = 0 // Пока данные в исходном файле наконец не закончатся
close(3)                                = 0
close(4)                                = 0
rename("./sedBGgCPj", "#1.txt")          = 0 // А затем просто замещаем оригинальный файл временным
// finita la comedia


Вот и вся магия системных утилит. 
Zmiuko, надеюсь на этом примере вам ясен алгоритм редактирования любого файла в общем случае? Если нет, то попробуйте к методам приведенным выше добавить в начало букву f.

И еще стоит заметить, что существует частный случай, когда все строки имеют фиксированную длину (т.е. когда длина любой строки остается неизменной). В этом случае вам не придется читать и перезаписывать весь файл. Алгоритмы, как это сделать, хорошо описаны в документации к PHP (ссылки вам привел Fortop во втором посте)

Это сообщение отредактировал(а) sTa1kEr - 4.3.2010, 15:49
PM MAIL   Вверх
IgorIV
Дата 4.3.2010, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 642
Регистрация: 7.9.2009

Репутация: 2
Всего: 8



Цитата(Zmiuko @  3.3.2010,  17:07 Найти цитируемый пост)
gif-анимация на php, округление углов

Я хотел вчера спросить, но постеснялся smile
Не подскажешь как это сделать на PHP? 
PM MAIL   Вверх
Zmiuko
  Дата 5.3.2010, 09:16 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


http://zmiuko.ru
**


Профиль
Группа: Участник
Сообщений: 297
Регистрация: 8.10.2008

Репутация: 2
Всего: 2



sTa1kEr, благодарю, вы очень популярно и качественно объяснили суть алгоритма. Одновременно и показали и рассказали. Благодарю. очевидно я был прав, что при редактированнии большого файла, необходимо производить изменение сегментарно и формировать кеш перезаписи, благодарю.

IgorIV, gif-анимация довольно сложна, прошу прощения что не могу уделить вам по ней времени, а вот округление углов - скрипт довольно прост:

Код

$filename = '...'; /* Замест ... пишем путь до *gif-jpg-png */
$radius = 10;

/**
 * Чем выше rate, тем лучше качество сглаживания и больше время обработки и
 * потребление памяти.
 *  
 * Оптимальный rate подбирается в зависимости от радиуса.
 */ 
$rate = 50;

$img = imagecreatefromstring(file_get__contents($filename));
imagealphablending($img, false);
imagesavealpha($img, true);

$width = imagesx($img);
$height = imagesy($img);

$rs_radius = $radius * $rate;
$rs_size = $rs_radius * 2;

$corner = imagecreatetruecolor($rs_size, $rs_size);
imagealphablending($corner, false);

$trans = imagecolorallocatealpha($corner, 255, 255, 255, 127);
imagefill($corner, 0, 0, $trans);

$positions = array(
    array(0, 0, 0, 0),
    array($rs_radius, 0, $width - $radius, 0),
    array($rs_radius, $rs_radius, $width - $radius, $height - $radius),
    array(0, $rs_radius, 0, $height - $radius),
);

foreach ($positions as $pos) {
    imagecopyresampled($corner, $img, $pos[0], $pos[1], $pos[2], $pos[3], $rs_radius, $rs_radius, $radius, $radius);
}

$lx = $ly = 0;
$i = -$rs_radius;
$y2 = -$i;
$r_2 = $rs_radius * $rs_radius;

for (; $i <= $y2; $i++) {

    $y = $i;
    $x = sqrt($r_2 - $y * $y);

    $y += $rs_radius;
    $x += $rs_radius;

    imageline($corner, $x, $y, $rs_size, $y, $trans);
    imageline($corner, 0, $y, $rs_size - $x, $y, $trans);

    $lx = $x;
    $ly = $y;
}

foreach ($positions as $i => $pos) {
    imagecopyresampled($img, $corner, $pos[2], $pos[3], $pos[0], $pos[1], $radius, $radius, $rs_radius, $rs_radius);
}

#header('Content-Type: image/png');
#imagepng($img); /* Вывод в браузер */
imagepng($img, "new_file_name.png"); /* Сохранение в файл  */


Надеюсь, что модератор не рассердиться.
PM MAIL WWW ICQ Skype Jabber   Вверх
smartov
Дата 5.3.2010, 09:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


свой собственный
****


Профиль
Группа: Экс. модератор
Сообщений: 4225
Регистрация: 2.2.2006
Где: NJ

Репутация: 7
Всего: 259



Цитата(sTa1kEr @  4.3.2010,  15:24 Найти цитируемый пост)
Это очень вредные подсказки, которые создают у новичков иллюзию, что системные утилиты используют какие-то магические методы. В то время, когда все эти утилиты используют все те-же базовые алгоритмы. 

Откровенно говоря я тоже ожидал от СЕДа более интеллектуального поведения вроде перезаписывания только изменившихся блоков файла.
PM MAIL   Вверх
gcc
Дата 5.3.2010, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: -1
Всего: 17



Zmiuko, в условии задания говорится что данные строки отсортированные или упорядоченные? если нет, то задание не реально простое, или не реально сложное (реляционная алгебра и т.д. smile )...

вы говорите у вас файл более 1 Гига, но например, если таблица или база будет 50-150Гб, разве MySQL будет весь файл перезаписывать для того чтобы вставить, обновить или удалить?


Это сообщение отредактировал(а) gcc - 5.3.2010, 10:58
PM WWW ICQ Skype GTalk Jabber   Вверх
Ипатьев
Дата 5.3.2010, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2232
Регистрация: 5.7.2009

Репутация: 28
Всего: 37



будет, конечно.
только не сразу.
PM MAIL   Вверх
Fortop
Дата 5.3.2010, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



Цитата(Zmiuko @  3.3.2010,  16:24 Найти цитируемый пост)
 На всем форуме мало кто решит данную проблему!

Омг, а разве это вообще проблема?

Цитата(smartov @  5.3.2010,  08:33 Найти цитируемый пост)
Откровенно говоря я тоже ожидал от СЕДа более интеллектуального поведения вроде перезаписывания только изменившихся блоков файла. 

И каким боком это должно быть реализовано? В случае если замещаемый блок неравноразмерен с новым - ничего не получится.

Zmiuko, рекомендую перечитать вот это
Цитата(Fortop @  27.2.2010,  06:57 Найти цитируемый пост)
А вот изменить файл без полной перезаписи будет много сложнее. (и это зависит от того используются ли равноразмерные строки, или же переменной длины)
Для редактирования равноразмерных строк можно использовать
http://php.net/rewind
http://php.net/fseek
http://php.net/fwrite

Тут предложены два единственно возможных варианта. Произвольный файл будет требовать полной перезаписи. Обойти это можно только лишь структурировав файл - например, ограничив длину строки 1000 символами ровно (даже если в ней лежит ровно 1на буква она будет занимать строку в 1000 байт). Большинство СУБД используют 2й вариант, естественно в более сложной форме.


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
LeoK
Дата 5.3.2010, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 14.12.2007
Где: Moscow

Репутация: нет
Всего: нет



а шелл бы был здесь как нельзя кстати smile
PM MAIL   Вверх
Ипатьев
Дата 5.3.2010, 15:26 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2232
Регистрация: 5.7.2009

Репутация: 28
Всего: 37



Fortop, с появлением полей типа TEXT и varchar второй вариант уже не актуален smile
Выравнивание ведь не единственное средство обеспечения произвольного доступа. хотя и наиболее доступное

Добавлено @ 15:29
LeoK, слово "здесь" к данной ситуации неприменимо.
Поскольку четкое позиционирование отсутствует. так что задача может быть как "здесь", так и "где-то там" или вообще "нигде".
Ближе всего к описанной задаче подходит "изобрести на коленке базу данных", о чем я уже давно и говорил, и к чему постепенно движется обсуждение. но в этом случае шелл, конечно, нужен, но гибче будет, все-таки, руками.

Это сообщение отредактировал(а) Ипатьев - 5.3.2010, 15:31
PM MAIL   Вверх
Fortop
Дата 5.3.2010, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



Цитата(Ипатьев @  5.3.2010,  14:26 Найти цитируемый пост)
С появлением полей типа TEXT и varchar второй вариант уже не актуален

Разве? 

Все сделано несколько более интеллектуальным, метаинформация хранится для записей(строк) поэтому они могут быть переменной длины.
Но тем не менее по-прежнему выделяются страницы/блоки (фиксированного размера) для хранения записей.
Во многих серверах блобы(поля типа TEXT) вообще хранятся в отдельных областях.

Но это именно структурирование хранимой информации.



--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
Закрытая темаСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0650 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.