|
| Дата |
|
USD/RUB | 93.4409 | BTC/USD | 66772.7701 |
|
|
|
Скрипты, программы и технические решения Обсуждаем скрипты, программы и новые технологии. |
31.10.2010, 10:50
|
#1
|
Ниибаца крутой програмер
Регистрация: 04.08.2009
Сообщений: 904
Бабло: $177555
|
ситывание большого числа файлов
какой способ для считывание 100k+ текстовых файлов, самый быстрый ?
del
тормозилось походу потому что считывал в переменную
при записи в файл и последуюющем считывании из него, работает быстрее
Последний раз редактировалось qazxcvbnm; 31.10.2010 в 11:01.
|
|
|
31.10.2010, 11:13
|
#2
|
Senior Member
Регистрация: 26.08.2008
Адрес: UA
Сообщений: 2,941
Бабло: $402835
|
Цитата:
Чтение файлов. Тут многим придется пересмотреть свои взгляды на чтение файла. Конкретный пример — есть статья, расположенная в файле, нужно считать ее, выполнить какие-то действия, а затем вывести на экран. Способов три.
Первый — банальный fopen + считывание построчно.
Второй — file+implode, то есть считываем в массив затем проводим слияние.
Третий — file_get_contents.
Я честно признаюсь сам не ожидал, но file_get_contents работает в десятки раз быстрее любого другого варианта. Функция считывает файл в строку, очень удобна для подобных случаев. Про fopen пока придется забыть. При помощи file удобно работать со словарями, где в каждой строке находится словарная статья (или какая-то запись). Если в вашем коде очень много обращений к файлам, которые нужно просто прочитать и вывести на экран — используйте file_get_contents. Если нужно сразу разбить файл на массив построчно — хорошо подойдет file.
Однако, почему же file_get_contents работает значительно быстрее? Ответ прост: она использует системные вызовы и системный кэш файлов, таким образом файл (причастом к нему обращении) запишется в оперативную память и будет считываться оттуда.
|
...
|
|
|
31.10.2010, 11:21
|
#3
|
Ниибаца крутой програмер
Регистрация: 04.08.2009
Сообщений: 904
Бабло: $177555
ТС -->
|
ТС
ну я и использовал file_get_contents
просто заносил всё в переменную
|
|
|
31.10.2010, 12:13
|
#4
|
Ниибаца крутой програмер
Регистрация: 04.08.2009
Сообщений: 904
Бабло: $177555
ТС -->
|
ТС
это я пытаюсь сделать статистику по частоте слов в 110k статьях ( http://gofuckbiz.com/showthread.php?t=20017)
со считыванием задача решена, но теперь проблемы с памятью
почему для массива из 17kk слов уходит 2 гига оперативки ? если длина каждого слова в среднем 6-8 символов ? слова же не по 100 символов
|
|
|
31.10.2010, 12:55
|
#5
|
добрый леприкон
Регистрация: 05.03.2009
Сообщений: 379
Бабло: $56978
|
не юзай пшп, СИ или подобный высокоуровневый изыг.
|
|
|
31.10.2010, 12:59
|
#6
|
автоматизирую интернеты
Регистрация: 05.07.2009
Адрес: chesser.ru
Сообщений: 3,362
Бабло: $470735
|
ну вот и я про то, что не такая уж и простая это задача
Кстати, стата с именно этих 110к статей у меня была вроде, на них вроде и тренировался.
Цитата:
почему для массива из 17kk слов уходит 2 гига оперативки ?
|
а представь у меня под терабайт текста распилено на статистику
памяти там и правда много уходит, юзай мускуль, будет дольше, зато про проблемы с памятью забудешь. А если захочешь увеличить скорость - сделай буфер из памяти, типа кеша, и результаты периодически в мускуль пиши.
|
|
|
31.10.2010, 13:20
|
#7
|
учу php
Регистрация: 04.04.2008
Сообщений: 1,162
Бабло: $68290
|
Цитата:
Сообщение от qazxcvbnm
это я пытаюсь сделать статистику по частоте слов в 110k статьях ( http://gofuckbiz.com/showthread.php?t=20017)
со считыванием задача решена, но теперь проблемы с памятью
почему для массива из 17kk слов уходит 2 гига оперативки ? если длина каждого слова в среднем 6-8 символов ? слова же не по 100 символов
|
Выложи код - подскажем что сделать лучше. Массив в php это не классический бинарный массив, это скорее ассоциативная последовательность записей. Там очень большие накладные расходы.
__________________
Подпись??? Не продам!
|
|
|
31.10.2010, 13:31
|
#8
|
Ниибаца крутой програмер
Регистрация: 04.08.2009
Сообщений: 904
Бабло: $177555
ТС -->
|
ТС
Цитата:
Сообщение от chesser
памяти там и правда много уходит, юзай мускуль, будет дольше, зато про проблемы с памятью забудешь. А если захочешь увеличить скорость - сделай буфер из памяти, типа кеша, и результаты периодически в мускуль пиши.
|
а при чём тут мускул если по любому придётся создавать массив, я ж не по частям буду его считать
Цитата:
Сообщение от JMen
Выложи код - подскажем что сделать лучше. Массив в php это не классический бинарный массив, это скорее ассоциативная последовательность записей. Там очень большие накладные расходы.
|
PHP код:
<?php
$start_time = microtime(true);
// 1.txt - адреса файлов
$strings = explode(PHP_EOL, trim(file_get_contents("1.txt"), PHP_EOL));
for ($strings_c=0; $strings_c<28000; $strings_c++)
{
$content = strtolower(implode(' ', explode(PHP_EOL, @file_get_contents($strings[$strings_c]))));
$content = str_replace('.', ' ', $content);
$content = str_replace('!', ' ', $content);
$content = str_replace('?', ' ', $content);
$content = str_replace(',', ' ', $content);
$content = str_replace(';', ' ', $content);
$content = str_replace('(', ' ', $content);
$content = str_replace(')', ' ', $content);
$content = explode(' ', $content);
for ($content_c=0; $content_c<sizeof($content); $content_c++)
{
if (!preg_match("/[^a-z\-\']/", $content[$content_c]) && !preg_match("/[^a-z]{2,}/", $content[$content_c]))
{
$x = $content[$content_c];
$content[$content_c] = preg_replace("/[^a-z]/", "*", $content[$content_c]);
if (substr_count($content[$content_c], '*') <= 2 && !stristr(' '.$content[$content_c], ' *') && !stristr($content[$content_c].' ', '* ') && $content[$content_c] != '')
{
$result[] = $x;
}
}
}
// echo $strings_c.' - '.sizeof($result).PHP_EOL;
}
echo (microtime(true) - $start_time).PHP_EOL;
$new_array_x = array_count_values($result);
asort($new_array_x);
echo (microtime(true) - $start_time).PHP_EOL;
$new_array_x = array_reverse($new_array_x);
foreach ($new_array_x as $key => $val)
{
if (trim($key) != '')
{
$result_x[] = trim($key);
$result_y[] = trim($key).' = '.$val;
}
}
$file = fopen("words.txt", "w");
fwrite($file, implode(PHP_EOL, $result_x));
fclose($file);
$file = fopen("words_count.txt", "w");
fwrite($file, implode(PHP_EOL, $result_y));
fclose($file);
sort($result_x);
$file = fopen("words_sort.txt", "w");
fwrite($file, implode(PHP_EOL, $result_x));
fclose($file);
echo microtime(true) - $start_time;
exit;
?>
|
|
|
31.10.2010, 13:56
|
#9
|
учу php
Регистрация: 04.04.2008
Сообщений: 1,162
Бабло: $68290
|
У тебя задача какая?
__________________
Подпись??? Не продам!
|
|
|
31.10.2010, 14:01
|
#10
|
хде мой компот?!
Регистрация: 07.01.2008
Сообщений: 327
Бабло: $31276
|
Бля тупею... Вот эта часть меня чета накаляет...
PHP код:
if (!preg_match("/[^a-z\-\']/", $content[$content_c]) && !preg_match("/[^a-z]{2,}/", $content[$content_c])) { $x = $content[$content_c];
$content[$content_c] = preg_replace("/[^a-z]/", "*", $content[$content_c]);
if (substr_count($content[$content_c], '*') <= 2 && !stristr(' '.$content[$content_c], ' *') && !stristr($content[$content_c].' ', '* ') && $content[$content_c] != '') { $result[] = $x; } }
|
|
|
|