我有一个只有单行的非常大的文件。它包含大约260万个数字。该文件约为15 mb。
我的目标是在这个单行字符串中找到第n个数字。
我尝试将文件读入字符串(记住它是单行文件)。然后我把字符串分解成一个我跑出内存的数组。 (允许的内存大小为268435456字节耗尽(试图分配71个字节)
我做得对吗?或者是否有另一种更容易的方法来查找非常大的字符串中的第n个值?
$file = file_get_contents ('a.txt', true);
$array = explode(" ", $file, -1);
echo $array[$nth];
答案 0 :(得分:0)
创建一个计数器变量;使用fopen
读取文件并使用feof
和fgets
(具有所需的缓冲区大小)将其循环一段时间;在循环中,检查你刚读过的位中有多少个空格(我假设你的条目用空格分隔,可以是逗号或其他);最后递增计数器并继续直到你到达你想要的部分(在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);
}
?>