|
| Дата |
|
USD/RUB | 89.7026 | BTC/USD | 68644.6161 |
|
|
|
Скрипты, программы и технические решения Обсуждаем скрипты, программы и новые технологии. |
31.10.2010, 10:50
|
Start Post: ситывание большого числа файлов
|
Ниибаца крутой програмер
Регистрация: 04.08.2009
Сообщений: 904
Бабло: $177555
|
какой способ для считывание 100k+ текстовых файлов, самый быстрый ?
del
тормозилось походу потому что считывал в переменную
при записи в файл и последуюющем считывании из него, работает быстрее
Последний раз редактировалось qazxcvbnm; 31.10.2010 в 11:01.
|
|
|
31.10.2010, 16:17
|
#22
|
Ниибаца крутой програмер
Регистрация: 04.08.2009
Сообщений: 904
Бабло: $177555
ТС -->
|
ТС
ошибка возникает на стадии формирования массива $result до использования функции array_count_values
Цитата:
for ($content_c=0; $content_c<$content_size; $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;
}
}
unset($content[$content_c]);
}
|
Последний раз редактировалось qazxcvbnm; 31.10.2010 в 16:30.
|
|
|
31.10.2010, 16:39
|
#23
|
хде мой компот?!
Регистрация: 07.01.2008
Сообщений: 327
Бабло: $31276
|
как вариант, с мускулем
создай таблу с тремя столбцами
для хеша - уникальное
для самого слова
и собсно кол-во вхождений
хеш бери md5, хотя по идее не принципиально
дальше как только ты получаешь слово
делай инсерт, если ошибка дублирования делай update кол-ва вхождений плюс один
|
|
|
31.10.2010, 16:43
|
#24
|
Senior Member
Регистрация: 26.08.2008
Адрес: UA
Сообщений: 2,941
Бабло: $402835
|
PHP код:
<?php $fin=fopen('in.txt', 'a+'); $fouta=fopen("a.txt","w+"); $foutb=fopen("b.txt","w+"); $foutc=fopen("c.txt","w+"); $foutd=fopen("d.txt","w+"); $foute=fopen("e.txt","w+"); $foutf=fopen("f.txt","w+"); $foutg=fopen("g.txt","w+"); $fouth=fopen("h.txt","w+"); $fouti=fopen("i.txt","w+"); $foutj=fopen("j.txt","w+"); $foutk=fopen("k.txt","w+"); $foutl=fopen("l.txt","w+"); $foutm=fopen("m.txt","w+"); $foutn=fopen("n.txt","w+"); $fouto=fopen("o.txt","w+"); $foutp=fopen("p.txt","w+"); $foutq=fopen("q.txt","w+"); $foutr=fopen("r.txt","w+"); $fouts=fopen("s.txt","w+"); $foutt=fopen("t.txt","w+"); $foutu=fopen("u.txt","w+"); $foutv=fopen("v.txt","w+"); $foutw=fopen("w.txt","w+"); $foutx=fopen("x.txt","w+"); $fouty=fopen("y.txt","w+"); $foutz=fopen("z.txt","w+"); $fout_=fopen("_.txt","w+"); while(!feof($fin)){ $input=fgets($fin, 8192); preg_match_all('/([^\W+-]+)/', trim($input), $matches); foreach ($matches[0] as $word){ $word = strtolower($word); switch ($word[0]) { case "a": fputs($fouta,$word."\r\n");break; case "b": fputs($foutb,$word."\r\n");break; case "c": fputs($foutc,$word."\r\n");break; case "d": fputs($foutd,$word."\r\n");break; case "e": fputs($foute,$word."\r\n");break; case "f": fputs($foutf,$word."\r\n");break; case "g": fputs($foutg,$word."\r\n");break; case "h": fputs($fouth,$word."\r\n");break; case "i": fputs($fouti,$word."\r\n");break; case "j": fputs($foutj,$word."\r\n");break; case "k": fputs($foutk,$word."\r\n");break; case "l": fputs($foutl,$word."\r\n");break; case "m": fputs($foutm,$word."\r\n");break; case "n": fputs($foutn,$word."\r\n");break; case "o": fputs($fouto,$word."\r\n");break; case "p": fputs($foutp,$word."\r\n");break; case "q": fputs($foutq,$word."\r\n");break; case "r": fputs($foutr,$word."\r\n");break; case "s": fputs($fouts,$word."\r\n");break; case "t": fputs($foutt,$word."\r\n");break; case "u": fputs($foutu,$word."\r\n");break; case "v": fputs($foutv,$word."\r\n");break; case "w": fputs($foutw,$word."\r\n");break; case "x": fputs($foutx,$word."\r\n");break; case "y": fputs($fouty,$word."\r\n");break; case "z": fputs($foutz,$word."\r\n");break; default: fputs($fout_,$word."\r\n");break; } } } fclose($fin); $fout = fopen("result.txt","w+"); for ($i = 'a'; $i < 'z'; $i++) { unset($fin); $fin = file ("$i.txt"); $result = array_count_values($fin); foreach ($result as $key => $value) { if ($value>1) //можно задать минимальную частоту для вывода { fputs ($fout,trim($key).";".trim($value)."\r\n"); } } } fclose($fout); ?>
идет построчное считывание так что от оперативки не зависит.
чтобы на подсчете повторений не дохло - разбиваем слова начинающиеся на букву а в файл а.txt, b в b.txt , заодно и посмотрим "мусор" в _.txt (если и так дохнет, то можем слова до 10 символов писать в а1, от10до20 в а2.тхт и т.д.)
так же можем сделать вывод от какой-то минимальной частоты.
сделал на быструю руку, вроде норм, но надо смотреть.
|
|
|
31.10.2010, 17:39
|
#25
|
автоматизирую интернеты
Регистрация: 05.07.2009
Адрес: chesser.ru
Сообщений: 3,362
Бабло: $470735
|
qazxcvbnm, ну mysql прикручивай, я ж тебе в первой своей мессаге сказал про него сам прошел через подобные мучения, только у меня статистики больше на несколько порядков
|
|
|
31.10.2010, 18:29
|
#26
|
Ниибаца крутой програмер
Регистрация: 04.08.2009
Сообщений: 904
Бабло: $177555
ТС -->
|
ТС
Цитата:
Сообщение от pina
как вариант, с мускулем
создай таблу с тремя столбцами
для хеша - уникальное
для самого слова
и собсно кол-во вхождений
хеш бери md5, хотя по идее не принципиально
дальше как только ты получаешь слово
делай инсерт, если ошибка дублирования делай update кол-ва вхождений плюс один
|
и сколько оно по времени займёт для 17kk слов ??
RedHead спасибо
Последний раз редактировалось qazxcvbnm; 31.10.2010 в 18:41.
|
|
|
31.10.2010, 19:17
|
#27
|
автоматизирую интернеты
Регистрация: 05.07.2009
Адрес: chesser.ru
Сообщений: 3,362
Бабло: $470735
|
qazxcvbnm,
кстати я так и не понял, откуда у тебя 17кк слов. В англ. языке более-менее используемых слов под 100к - и ни один америкос столько слов не знает. 17кк откуда блять?
ты в цикле когда по словам бежишь вместо:
$result[] = $x;
напиши:
$result[$x]++;
и все будет тип-топ и не надо всякие там функции подсчета массивов применять
|
|
|
31.10.2010, 19:40
|
#28
|
Ниибаца крутой програмер
Регистрация: 04.08.2009
Сообщений: 904
Бабло: $177555
ТС -->
|
ТС
Цитата:
Сообщение от chesser
qazxcvbnm,
кстати я так и не понял, откуда у тебя 17кк слов. В англ. языке более-менее используемых слов под 100к - и ни один америкос столько слов не знает. 17кк откуда блять?
|
вообщето там 60kk http://gofuckbiz.com/showthread.php?t=20017 (но из-за ограничения оперативки обработалось только 17kk)
хотя уже всё обработалось благодаря коду redhead
Цитата:
Сообщение от chesser
и не надо всякие там функции подсчета массивов применять
|
и как подсчитывать количество вхождений ?
|
|
|
31.10.2010, 20:01
|
#29
|
конверчу-хуеверчу
Регистрация: 16.09.2009
Сообщений: 605
Бабло: $103180
|
бля какие нахуй 60 миллионов, в 2006 году было около 1кк.
update: да, чет я проебался.
60 лямов это вся рыба, я чет про колво всех слов в анг.языке подумал)
Последний раз редактировалось citrix; 31.10.2010 в 20:07.
|
|
|
31.10.2010, 20:05
|
#30
|
Ниибаца крутой програмер
Регистрация: 04.08.2009
Сообщений: 904
Бабло: $177555
ТС -->
|
ТС
Цитата:
Сообщение от citrix
бля какие нахуй 60 миллионов, в 2006 году было около 1кк.
|
по ссылке пройди, там 110k текстов, в которых примерно 60kk слов, скрипт насчитал около 130k уникальных без мусора
|
|
|
01.11.2010, 00:59
|
#31
|
учу php
Регистрация: 04.04.2008
Сообщений: 1,162
Бабло: $68290
|
Пипец, я так и не понял зачем там все те огороды нужны... Счас аську скину.
__________________
Подпись??? Не продам!
|
|
|
|