Загрузить текстовый файл в память

Статус
В этой теме нельзя размещать новые ответы.
Ну вообщем с shmop получилось, хотя можно было сделать и через eaccelerator, но не суть.

Осталась проблемка, сейчас расскажу какая. Код такого вида:

$f = fopen('file.csv', "rt");

shmop_open...
shmop_write...


$f = shmop_read($shm_id, 0, $shm_size);

А вот здесь проблема:

for ($i=0; $data=fgetcsv($f,1000,',', '"'); $i++) {
print_r($data);
}

Результат ноль, видимо из-за того, что изначально $f Resource id #4, а после попадания в память $f возвращается как простой массив array.

Что-нить можно сделать?
 
Что-то непонятно, как Вы $f используете и зачем вообще fopen()
 
да я уже понял, поздно было, тупка началась ночная :)

надо не $filehandle в память помещать, а дамп файла fread($filehandle);
 
Повесь файл на memcached, чем не вариант) Но с большими файлами нужен мощный сервер будет)

Вообще, зачем такое извращение?)
 
Да так, в файле хранится кой какая база, которую дрочат юзеры, не охото грузить мускул, в memory побыстрее будет.
 
может я не прав но мускул именно для подобных задач
что бы не занимать лишнее место, не груить серв, а что будет серваку от 1 запроса...
 
Мускул хорош для структуирования данных, поиска, сложных запросов, а файлы хороши для простых задач, они быстрее.
 
Мускул хорош для структуирования данных, поиска, сложных запросов, а файлы хороши для простых задач, они быстрее.

Ты, конечно, нагородил знатное решение, shmop это на самом деле круто, молодец. Но. Ты вообще тестировал?

Ну то есть я понимаю, если мыслить логически, то вот у нас файл на 5 метров, вот php-скрипт, который к нему обращается, вот таких вот php-скриптов у нас на серваке будет выполняться по 100 в минуту, это что, каждый раз лопатить 5-меговый файл? Некруто, надо как-то считать в память. Так примерно рассуждал? )

Так вот, на любом нормальном серваке у тебя эти пять метров после первого же обращения ложатся в кеш. Обычный такой дисковый кеш. И потом считываются твоим скриптом каждый раз без реального обращения к винту. И ты если замеришь скорость на каких-нибудь там 1000 запросов, то сам увидишь, что shmop ни фига не дало выигрыша в скорости, а код усложнило. Мало того, shmop берет данные из разделяемой памяти, а значит тут еще и переключение контекста будет происходить, в то время как дисковый кеш - он на уровне ядра. Так что в некоторых случаях shmop окажется в итоге еще и медленнее, чем "в лоб" чтение с диска. Невероятно, правда?

Я согласен, в это трудно поверить, но я собственно и не призываю. Я призываю самому потестить. Эксперимент - орудие науки! )
 
Ну вообщем, я честно говоря сам не ожидал подобного результата.
Обычное чтение файла через fopen и fgetcsv и поиск в нём нужной строки в среднем 0.25-0.5с в зависимости от удаления от начала.

Теперь, что касательно кэша с помощью еакселератора:

Чтение файла целиком, помещение его в переменную, нахождение нужной строки в массиве, помещение переменной в shared memory - 4.1с !!

Теперь файл целиком закэширован, повторяем операцию без чтения с диска - достаем его из памяти и находим нужное значение в массиве - 3.9 с !
 
А что за файл? Его нельзя в БД поместить и потом с помощью SQL искать?
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху