哪种方法可以在10.000行的文件中随机获取10行?

时间:2013-08-13 15:14:10

标签: php performance file random line

我的文件里面有~10,000行。我希望每次用户访问我的网站时,它会自动随机选择10行 我目前使用的代码:

$filelog = 'items.txt';
$random_lines = (file_exists($filelog))? file($filelog) : array();
$random_count = count($random_lines);
$random_file_html = '';
if ($random_count > 10)
{
    $random_file_html = '<div><ul>';
    for ($i = 0; $i < 10; $i++)
    {
        $random_number = rand(0, $random_count - 1); // Duplicate are accepted
        $random_file_html .= '<li>'.$random_lines[$random_number]."</li>\r\n";
    }
    $random_file_html .= '</ul>
    </div>';
}

当我有&lt; 1000行,每件事都可以。但现在,1000线。它使我的网站显着减慢 我正在考虑其他方法,例如:

将文件分割为50个文件,随机选择它们,然后在所选文件中选择10行randoms - 或 -
我知道总线(项目)。随机制作10个数字,然后阅读文件使用

$file = new SplFileObject('items.txt');
$file->seek($ranđom_number);
echo $file->current();

(我的服务器不支持任何类型的SQL)

也许你有其他方法最适合我。什么是我的问题的最佳方法?非常感谢你!

3 个答案:

答案 0 :(得分:0)

最快的方式显然是从每个用户请求内部〜10.000行的文件中随机挑选10行。
由于我们不知道这个“XY问题”的细节,所以不可能回答更多问题。

答案 1 :(得分:0)

如果可以调整文件的内容,则只需填充每一行,使它们具有相同的长度。然后,您可以使用随机访问访问文件中的行。

  $lineLength = 50; // this is the assumed length of each line

  $total = filesize($filename);
  $numLines = $total/$lineLength;

  // get ten random numbers
  $fp = fopen($filename, "r");
  for ($x = 0; $x < 10; $x++){
       fseek($fp, (rand(1, $numLines)-1)*$lineLength, SEEK_SET);
       echo fgets($fp, 50);
  }
  fclose($fp);

答案 2 :(得分:-1)

尝试:

$lines = file('YOUR_TXT_FILE.txt');
$rand  = array_rand($lines);

echo $lines[$rand];

其中10个只是把它放在一个循环中:

$lines = file('YOUR_TXT_FILE.txt');
for ($i = 0; $i < 10; $i++) {
   $rand = array_rand($lines);
   echo $lines[$rand];
}

注意:**上述代码不保证** 2 相同的行不会被选中。为了保证唯一性,你需要添加额外的while循环和一个包含所有随机生成的索引的数组,所以下次生成它并且它已经存在于数组中时,生成另一个直到它不在数组中。

上述解决方案可能不是最快但可能满足您的需求。由于您的服务器不支持任何类型的SQL,可能切换到不同的服务器?因为我想知道你如何存储用户数据?那些也存储在文件中吗?