Форум успешных вебмастеров - GoFuckBiz.com

  Форум успешных вебмастеров - GoFuckBiz.com > Бизнес-решения > Скрипты, программы и технические решения
Дата
USD/RUB58.8620
BTC/USD0.0000
Скрипты, программы и технические решения Обсуждаем скрипты, программы и новые технологии.

Закрытая тема
Опции темы Опции просмотра
Старый 31.10.2010, 10:50   #1
qazxcvbnm
Ниибаца крутой програмер
 
Аватар для qazxcvbnm
 
Регистрация: 04.08.2009
Сообщений: 904
Бабло: $177555
По умолчанию ситывание большого числа файлов

какой способ для считывание 100k+ текстовых файлов, самый быстрый ?

del

тормозилось походу потому что считывал в переменную

при записи в файл и последуюющем считывании из него, работает быстрее

Последний раз редактировалось qazxcvbnm; 31.10.2010 в 11:01.
qazxcvbnm вне форума  
Старый 31.10.2010, 11:13   #2
RedHead
Senior Member
 
Аватар для RedHead
 
Регистрация: 26.08.2008
Адрес: UA
Сообщений: 2,946
Бабло: $402755
По умолчанию

Цитата:
Чтение файлов. Тут многим придется пересмотреть свои взгляды на чтение файла. Конкретный пример — есть статья, расположенная в файле, нужно считать ее, выполнить какие-то действия, а затем вывести на экран. Способов три.
Первый — банальный fopen + считывание построчно.
Второй — file+implode, то есть считываем в массив затем проводим слияние.
Третий — file_get_contents.

Я честно признаюсь сам не ожидал, но file_get_contents работает в десятки раз быстрее любого другого варианта. Функция считывает файл в строку, очень удобна для подобных случаев. Про fopen пока придется забыть. При помощи file удобно работать со словарями, где в каждой строке находится словарная статья (или какая-то запись). Если в вашем коде очень много обращений к файлам, которые нужно просто прочитать и вывести на экран — используйте file_get_contents. Если нужно сразу разбить файл на массив построчно — хорошо подойдет file.

Однако, почему же file_get_contents работает значительно быстрее? Ответ прост: она использует системные вызовы и системный кэш файлов, таким образом файл (причастом к нему обращении) запишется в оперативную память и будет считываться оттуда.
...
RedHead вне форума  
Старый 31.10.2010, 11:21   #3
qazxcvbnm
Ниибаца крутой програмер
 
Аватар для qazxcvbnm
 
Регистрация: 04.08.2009
Сообщений: 904
Бабло: $177555
ТС -->
автор темы ТС По умолчанию

ну я и использовал file_get_contents

просто заносил всё в переменную
qazxcvbnm вне форума  
Старый 31.10.2010, 12:13   #4
qazxcvbnm
Ниибаца крутой програмер
 
Аватар для qazxcvbnm
 
Регистрация: 04.08.2009
Сообщений: 904
Бабло: $177555
ТС -->
автор темы ТС По умолчанию

это я пытаюсь сделать статистику по частоте слов в 110k статьях (http://gofuckbiz.com/showthread.php?t=20017)

со считыванием задача решена, но теперь проблемы с памятью

почему для массива из 17kk слов уходит 2 гига оперативки ? если длина каждого слова в среднем 6-8 символов ? слова же не по 100 символов
qazxcvbnm вне форума  
Старый 31.10.2010, 12:55   #5
jskorvin
добрый леприкон
 
Аватар для jskorvin
 
Регистрация: 05.03.2009
Сообщений: 380
Бабло: $56968
По умолчанию

не юзай пшп, СИ или подобный высокоуровневый изыг.
__________________
EvaPharmacy - лучшая фарма партнерка (ICQ: 750000 Jabber: [email protected]) / Помощь детям.
jskorvin вне форума  
Старый 31.10.2010, 12:59   #6
chesser
автоматизирую интернеты
 
Аватар для chesser
 
Регистрация: 05.07.2009
Адрес: chesser.ru
Сообщений: 3,382
Бабло: $470735
По умолчанию

ну вот и я про то, что не такая уж и простая это задача
Кстати, стата с именно этих 110к статей у меня была вроде, на них вроде и тренировался.

Цитата:
почему для массива из 17kk слов уходит 2 гига оперативки ?
а представь у меня под терабайт текста распилено на статистику

памяти там и правда много уходит, юзай мускуль, будет дольше, зато про проблемы с памятью забудешь. А если захочешь увеличить скорость - сделай буфер из памяти, типа кеша, и результаты периодически в мускуль пиши.
__________________
USA и NL серверы и VPS | wiki | блог | Drupal | NginxТДС
Ave, Google, morituri te salutant! © chesser
chesser вне форума  
Старый 31.10.2010, 13:20   #7
JMen
учу php
 
Регистрация: 04.04.2008
Сообщений: 1,163
Бабло: $68290
По умолчанию

Цитата:
Сообщение от qazxcvbnm Посмотреть сообщение
это я пытаюсь сделать статистику по частоте слов в 110k статьях (http://gofuckbiz.com/showthread.php?t=20017)

со считыванием задача решена, но теперь проблемы с памятью

почему для массива из 17kk слов уходит 2 гига оперативки ? если длина каждого слова в среднем 6-8 символов ? слова же не по 100 символов
Выложи код - подскажем что сделать лучше. Массив в php это не классический бинарный массив, это скорее ассоциативная последовательность записей. Там очень большие накладные расходы.
__________________
Подпись??? Не продам!
JMen вне форума  
Старый 31.10.2010, 13:31   #8
qazxcvbnm
Ниибаца крутой програмер
 
Аватар для qazxcvbnm
 
Регистрация: 04.08.2009
Сообщений: 904
Бабло: $177555
ТС -->
автор темы ТС По умолчанию

Цитата:
Сообщение от chesser Посмотреть сообщение
памяти там и правда много уходит, юзай мускуль, будет дольше, зато про проблемы с памятью забудешь. А если захочешь увеличить скорость - сделай буфер из памяти, типа кеша, и результаты периодически в мускуль пиши.
а при чём тут мускул если по любому придётся создавать массив, я ж не по частям буду его считать




Цитата:
Сообщение от JMen Посмотреть сообщение
Выложи код - подскажем что сделать лучше. Массив в php это не классический бинарный массив, это скорее ассоциативная последовательность записей. Там очень большие накладные расходы.


PHP код:
<?php

$start_time 
microtime(true);



// 1.txt - адреса файлов


$strings explode(PHP_EOLtrim(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], '*') <= && !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($fileimplode(PHP_EOL$result_x));

fclose($file);



$file fopen("words_count.txt""w");

fwrite($fileimplode(PHP_EOL$result_y));

fclose($file);



sort($result_x);

$file fopen("words_sort.txt""w");

fwrite($fileimplode(PHP_EOL$result_x));

fclose($file);




echo 
microtime(true) - $start_time;



exit;

?>
qazxcvbnm вне форума  
Старый 31.10.2010, 13:56   #9
JMen
учу php
 
Регистрация: 04.04.2008
Сообщений: 1,163
Бабло: $68290
По умолчанию

У тебя задача какая?
__________________
Подпись??? Не продам!
JMen вне форума  
Старый 31.10.2010, 14:01   #10
pina
хде мой компот?!
 
Регистрация: 07.01.2008
Сообщений: 327
Бабло: $31276
Отправить сообщение для pina с помощью ICQ
По умолчанию

Бля тупею... Вот эта часть меня чета накаляет...
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], '*') <= && !stristr(' '.$content[$content_c], ' *') && !stristr($content[$content_c].' ''* ') && $content[$content_c] != '')
                        {
                            
$result[] = $x;
                        }
                } 
pina вне форума  
Закрытая тема



Опции темы
Опции просмотра