2014-12-31 2 views
0

У меня очень большой файл с одной строкой. Он содержит около 2,6 миллиона номеров. Файл составляет около 15 мб.Получить n-й номер из строки

Моя цель - найти n-е число в этой строке.

Я попытался прочитать файл в строке (помните, что это файл с одной строкой). Затем я взорвал строки в массив, в котором у меня закончилась память. (Разрешены памяти размером 268435456 байт исчерпаны (пытались выделить 71 байт)

Могу ли я делать это правильно? Или есть еще более простой способ найти п-е значение в очень большой строке?

$file = file_get_contents ('a.txt', true); 
$array = explode(" ", $file, -1); 
echo $array[$nth]; 
+1

Это в 'php'? – corsiKa

+0

Да. Извините, на PHP. – Frank

+0

Нам нужно больше узнать о вашем файле. Когда вы скажете 2,6 миллиона номеров, вы, очевидно, не говорите о 2,6 миллиона * цифр *, или файл будет 2,6 мб, а не 15 Мб. Поэтому покажите нам пример того, с чем вы на самом деле работаете. – meagar

ответ

0

Создать переменная счетчика, прочитайте файл с помощью fopen и зациклируйте его на некоторое время с feof и fgets (с желаемым размером буфера); в пределах цикла проверьте, сколько пробелов присутствует в бит, который вы только что прочитали (я принимаю ваши записи разделяются пробелами, это может быть запятая или что-то еще); наконец, увеличивайте счетчик и продолжайте, пока не дойдете до нужной вам части (после n количества пробелов, вы введите [n+1]th запись, которую вы ищете).

Я включаю в себя некоторые проверенные (с файлом 16 МБ) код с доказательством концепции. Я не знаю, есть ли лучшие способы сделать это; это единственный, который пришел мне на ум, и он работает. memory_get_usage сообщает об использовании памяти ~ 8 кб.

<?php 

$counter; 
$nth = 49959; 
$handle = @fopen('numbers.txt', 'r'); // File containing numbers from 1 to 2130829, size ~16 MB. 

if ($handle) { 
    while (($buffer = fgets($handle, 128)) !== false) { 
     $spaces = substr_count($buffer, ' '); 

     if ($counter + $spaces > $nth) { 
      $numbers = explode(' ', $buffer); 
      $key = $nth - $counter; 
      echo $numbers[$key]; // print '49959' 
      exit; 
     } 
     else { 
      $counter += $spaces; 
     } 
    } 

    if (!feof($handle)) { 
     echo "Error: unexpected fgets() fail\n"; 
    } 

    fclose($handle); 
} 

?> 
+0

Спасибо. Как указано выше, цифры имеют разные размеры, например 0, 122, -233 и т. Д. Они ограничены пробелом. Как использовать fgets для чтения одного числа (без цифры)? – Frank

+0

Вы не можете, но это не имеет значения, потому что вы просто зацикливаете, пока не найдете свой номер. Я написал код с доказательством концепции и протестировал его. Я включил его в ответ. – entropid

+0

Спасибо, Энтропид. Я думаю, это работает! Но мне также интересно, помещаю ли эти цифры в таблицу mysql с идентификатором, Number, как только два столбца. Поэтому я могу посмотреть его по ID каждый раз, когда мне нужно что-то посмотреть. будет ли это быстрее, чем каждый раз? – Frank

Смежные вопросы