Чтение файла 50 Гб!

Здравствуйте!

Я перегоняю записи из текстового файла в MySQL.
В файле - поисковые запросы по 1 на строчку.

За 2-е суток прочитал только 286312691 записей, а будет чуть больше миллиарда.
И все медленнее и медленнее, это на месяц затянется.
Вот такой код:

PHP:
$handle = @fopen("D:\кeys.txt", "r");

if ($handle) { 
    for($i=0; $i<=1000000000; $i++){             
        
        $k1 = trim(fgets($handle));
        $k = iconv('utf-8', 'cp1251', $k1);        
        $k = nosym($k);
        $num = explode(' ', $k);
        $num = count($num);
        $len = strlen($k);
         
        if ($k){
            mysql_query("REPLACE INTO `table` SET `key`='$k', `num`='$num', `len`='$len'"); 
        }  
    }
}
Как думаете, можно ли такой файл открыть разом и загнать в mysql? В компе 16гб оперативки


прокатит ли код типа
PHP:
$handle = file_get_contents("D:\кeys.txt");

// далее надо как то разбить по строчкам... как не знаю пока..

if ($handle) { 
    for($i=0; $i<=1000000000; $i++){             
        
        $k1 = trim(fgets($handle));
        $k = iconv('utf-8', 'cp1251', $k1);        
        $k = nosym($k);
        $num = explode(' ', $k);
        $num = count($num);
        $len = strlen($k);
         
        if ($k){
            mysql_query("REPLACE INTO `table` SET `key`='$k', `num`='$num', `len`='$len'"); 
        }  
    }
}
 

AmdY

Пью пиво
Команда форума
Андрей Силаев
убей на время перегонки все ключи. сделай в начале iconv всего файла. можно sed-ом привести файл к виду, подходящему для LOAD DATA INFILE
 

флоппик

promotor fidei
Команда форума
Партнер клуба
AmdY, он его поди еще и под виндой запускает...
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Андрей Силаев
В компе 16Гиг оперативки, файл весит 50Гиг, сколько уйдет в своп?
 
  • Like
Реакции: AmdY

AmdY

Пью пиво
Команда форума
PHP:
$handle = file_get_contents("D:\кeys.txt");
:) c0dex прав, второй результат ужасен.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
флоппик
А вдруг он поставил лимит "многабольше"?)
 
я могу лимит поставить любой. Просто построчное считывание не катит, с каждым разом все медленнее и медленнее работает.
Сейчас придумал, что можно как-то разбить 1 файл на 50 файлов по 1 гигабайту. Но чем?
 

tony2001

TeaM PHPClub
>$handle = file_get_contents("D:\кeys.txt");

50Gb = 53687091200 байт
длина строки в PHP хранится в signed int32, максимальное значение которого 2147483648.
если забить на память, мне кажется, что-то здесь всё равно не будет работать..
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
флоппик
это был сарказм
 
Text File Splitter

разбиваю файл по 1 гигу. Тогда буду читать построчно. Примерно пол часа на 1 гигабайт.
За сутки справлюсь!
 

tony2001

TeaM PHPClub
В таком случае сразу продумайте как вы будете разбивать это на кластер серверов БД.
 

Dez

Новичок
Это когда на разные компы базу разнести. Плюс гуглить по партициям и т.д.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
вопрос в стиле Фаната: Андрей Силаев, а что ты с этими данными собираешься делать?
 
Сверху