从字符串中获取第n个数字

时间:2014-12-31 05:41:06

标签: php string memory explode

我有一个只有单行的非常大的文件。它包含大约260万个数字。该文件约为15 mb。

我的目标是在这个单行字符串中找到第n个数字。

我尝试将文件读入字符串(记住它是单行文件)。然后我把字符串分解成一个我跑出内存的数组。 (允许的内存大小为268435456字节耗尽(试图分配71个字节)

我做得对吗?或者是否有另一种更容易的方法来查找非常大的字符串中的第n个值?

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

1 个答案:

答案 0 :(得分:0)

创建一个计数器变量;使用fopen读取文件并使用feoffgets(具有所需的缓冲区大小)将其循环一段时间;在循环中,检查你刚读过的位中有多少个空格(我假设你的条目用空格分隔,可以是逗号或其他);最后递增计数器并继续直到你到达你想要的部分(在n个空格后,你有[n+1]th条目你想要的。)

我包含一些经过测试的(带有16 MB文件)概念验证代码。我不知道是否有更好的方法来做到这一点;这是唯一一个出现在我脑海中的作品。 memory_get_usage报告内存使用量约为8 kb。

<?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);
}

?>