使用PHP在不使用ram内存的情况下以二进制搜索方式读取文本文件

使用PHP在不使用ram内存的情况下以二进制搜索方式读取文本文件,php,Php,我需要制作一个脚本,在不使用内存ram的情况下,通过二进制搜索读取由管道“|”分隔的文件。我怎么做 我试过: $handle = fopen("myfile.txt", "r"); if ($handle) { while (($line = fgets($handle)) !== false) { // while reads line make binary search } fclose($handle); } else { // error

我需要制作一个脚本,在不使用内存ram的情况下,通过二进制搜索读取由管道“|”分隔的文件。我怎么做

我试过:

$handle = fopen("myfile.txt", "r");
if ($handle) {
    while (($line = fgets($handle)) !== false) {
       // while reads line make binary search
    }

    fclose($handle);
} else {
   // error opening the file.
} 
myfile.txt

  Name|Title|Andrew|TheBook1|July|TheChest|Carol|OneTime

您可以使用
stream\u get\u line
将管道用作分隔符

while (($name = stream_get_line($handle, 0, '|')) !== false) {
   // if ($name == 'Carol') { ...
}

您可以使用
stream\u get\u line
将管道用作分隔符

while (($name = stream_get_line($handle, 0, '|')) !== false) {
   // if ($name == 'Carol') { ...
}

由于它的家庭作业,我将给你一些提示/步骤,让你了解如何实施它们:)

  • 二进制搜索算法将搜索分为块。在每一步中,它将包含元素的块切成两半。这就是为什么最初它的速度非常快
  • 为此,您需要按字母顺序排列数据。这个练习说你必须在不使用内存的情况下实现二进制搜索。并不是说你不能使用内存来整理你的数据。所以用“|”来分解字符串,按字母顺序排列,然后再次内爆。这是您订购的字符串
  • 对于实际的算法,您不能使用内存,因此只能使用文件系统
  • 你需要知道你要搜索的街区的起点和芬兰人
  • 我不知道你是否被允许在内存中使用变量。如果没有,您还必须将变量写入文件
  • 在这种情况下,可以编写诸如getBlockStart()、getBlockEnd()、setBlockStart、setBlockEnd()之类的函数,这些函数从文件中读取/写入值
  • 使用
    blockStart=,blockEnd=
  • 切分两部分,根据字母顺序查看元素的哪一部分
  • 要签出第10个元素,只需读取文件中的10个元素。这样你就可以到达它
  • 重复此操作,直到找到要查找的元素

  • 由于它的家庭作业,我将给你一些提示/步骤,让你了解如何实施它们:)

  • 二进制搜索算法将搜索分为块。在每一步中,它将包含元素的块切成两半。这就是为什么最初它的速度非常快
  • 为此,您需要按字母顺序排列数据。这个练习说你必须在不使用内存的情况下实现二进制搜索。并不是说你不能使用内存来整理你的数据。所以用“|”来分解字符串,按字母顺序排列,然后再次内爆。这是您订购的字符串
  • 对于实际的算法,您不能使用内存,因此只能使用文件系统
  • 你需要知道你要搜索的街区的起点和芬兰人
  • 我不知道你是否被允许在内存中使用变量。如果没有,您还必须将变量写入文件
  • 在这种情况下,可以编写诸如getBlockStart()、getBlockEnd()、setBlockStart、setBlockEnd()之类的函数,这些函数从文件中读取/写入值
  • 使用
    blockStart=,blockEnd=
  • 切分两部分,根据字母顺序查看元素的哪一部分
  • 要签出第10个元素,只需读取文件中的10个元素。这样你就可以到达它
  • 重复此操作,直到找到要查找的元素

  • 使用生成器读取(
    yield
    ),请参阅。生产线的内存占用较低。@Xorifelse,
    yield
    在这里有什么用处?
    $line
    在每次迭代中都会被覆盖。您所说的二进制搜索是什么意思。你在找什么。您是在读取的行中搜索还是在整个文件中搜索?这是一个什么样的奇怪用例?作业为什么不干脆用“|”来爆炸并搜索呢?二进制搜索需要对输入进行排序,因此您必须将其加载到内存中才能对其进行排序…@Patrick its作为家庭作业。我需要在不使用内存ram的情况下实现它,我想不出一种方法来实现。使用生成器读取(
    yield
    ),请参阅。生产线的内存占用较低。@Xorifelse,
    yield
    在这里有什么用处?
    $line
    在每次迭代中都会被覆盖。您所说的二进制搜索是什么意思。你在找什么。您是在读取的行中搜索还是在整个文件中搜索?这是一个什么样的奇怪用例?作业为什么不干脆用“|”来爆炸并搜索呢?二进制搜索需要对输入进行排序,因此您必须将其加载到内存中才能对其进行排序…@Patrick its作为家庭作业。我需要在不使用内存ram的情况下实现它,我想不出一种方法来实现它。但是我仍然需要使用二进制搜索算法。但是我仍然需要使用二进制搜索算法