C 大文件的搜索算法

C 大文件的搜索算法,c,algorithm,C,Algorithm,我需要帮助决定使用搜索算法来搜索大文件。 这就是我正在做的。假设文件由时间范围t1到t2组成。(t2>t1) 我需要获得以下文件偏移量(fseek): 时间t3大于t1 小于时间t2的时间t4 | ------| ---|----------------| t1 t3 t4 t2 Naive版本是在整个文件中迭代行,当当前时间为t3时返回fseek,从返回的seek开始,当当前时间为t4时迭代,返回第二个fseek 现在让我们假设这个文件是100GB

我需要帮助决定使用搜索算法来搜索大文件。 这就是我正在做的。假设文件由时间范围t1到t2组成。(t2>t1)

我需要获得以下文件偏移量(fseek):

  • 时间t3大于t1
  • 小于时间t2的时间t4

    | ------| ---|----------------|
    
    t1      t3   t4              t2
    
  • Naive版本是在整个文件中迭代行,当当前时间为t3时返回fseek,从返回的seek开始,当当前时间为t4时迭代,返回第二个fseek

    现在让我们假设这个文件是100GB,我需要迭代,而这个文件只需要2秒的时间。 这样,这种逻辑就变得过于CPU和文件系统昂贵。寻找更好的解决方案。使用的语言是C。

    当前行的大小是固定的,但我想展望未来,处理一些不使用固定大小长度的算法。

    如果文件中的时间都已排序,则可以使用。如果文件中的记录具有固定的宽度,则更好,但即使没有,也可以通过一些工作来利用它。

    如果文件中的时间都已排序,则可以使用。如果文件中的记录具有固定宽度就更好了,但即使没有,您也可以通过一些工作来利用它。

    由于这些值是固定宽度的,因此二进制搜索或插值搜索听起来是最好的选择。此外,如果您计划使用这些大小类(100GB)中的文件,则由于FSETH的文件大小限制,应该考虑使用FGETPOS/FSETPOS。

    < P>,因为值是固定宽度的,类似二进制搜索或类似于最佳搜索的插值搜索声音。此外,如果您计划使用这些大小类(100GB)中的文件,则应考虑使用FGOPS/FSEPOPs,因为FSETH的文件大小限制。

    会创建一个时间值索引来对它们的文件偏移进行帮助吗?如果文件理论上没有定义的最大大小,那么我们处理的似乎是不可撤销的有限内存。我可以做的一件事是每n行检查一个文件,并在某个地方写入偏移量,但这也不是理论上无限文件的解决方案。创建文件偏移量的时间值索引会有帮助吗?如果文件的最大大小理论上未定义,并且我们处理的内存有限,似乎是可撤消的。我可以做的一件事是每n行检查一个文件,然后把偏移量写在某个地方,但理论上这不是一个无限文件的解决方案。所有时间都是时间戳、排序、固定宽度。有时有多行具有相同的时间戳。@user196188:Perfect。如果记录的宽度固定,则可以计算任何记录的确切起点。你可以通过计算文件中间记录的偏移开始你的二进制搜索,然后查看你搜索的时间是否比那个时间早或晚。然后查找介于第一次和文件开始/结束之间的记录,依此类推,直到找到正确的记录。如果可能有多条记录具有相同的时间戳,则在找到匹配的时间戳后,必须检查以前的记录,为了确保第一条记录与给定的时间戳匹配,而不是任意的时间戳。一旦这项工作正常,您应该考虑将其修改为插值二进制搜索。这与二进制搜索相同,只是不在当前搜索窗口的中间搜索,而是搜索位置
    (t-t1)/(t2-t1)
    。所有时间都是时间戳、排序、固定宽度。有时有多行具有相同的时间戳。@user196188:Perfect。如果记录的宽度固定,则可以计算任何记录的确切起点。你可以通过计算文件中间记录的偏移开始你的二进制搜索,然后查看你搜索的时间是否比那个时间早或晚。然后查找介于第一次和文件开始/结束之间的记录,依此类推,直到找到正确的记录。如果可能有多条记录具有相同的时间戳,则在找到匹配的时间戳后,必须检查以前的记录,为了确保第一条记录与给定的时间戳匹配,而不是任意的时间戳。一旦这项工作正常,您应该考虑将其修改为插值二进制搜索。这与二进制搜索相同,不同的是,您没有搜索到当前搜索窗口的中间,而是搜索定位
    (t-t1)/(t2-t1)
    。如果需要添加更多类型的文件,即行长度不固定的文件,您知道吗?Im目前使用fseek,ftell和gccfgetpos/fsetpos中的#define#FILE _OFFSET(偏移量)位64不有用,因为它们只能返回到您已经访问过的位置,而不能搜索任意偏移量。使用fseeko/ftello(这些是POSIX而不是普通的C),并确保您的构建环境是64位文件偏移量,就像它看起来的那样。好吧,让事情变得更复杂一点,我将整个RPC的混乱发送到java,以读取这些偏移量并向用户显示行。我不认为java与非实时搜索兼容,在这种情况下,看起来fseeko/ftello是一个更好的选择。对于可变长度的行,也许制作一个时间值索引(如上所述)就可以了?您也可以尝试一些预先制作的数据库管理,比如Tokyo Cabinet。好的,如果我需要添加更多类型的文件,即行长度不固定的文件,您知道吗?Im目前使用fseek,ftell和gccfgetpos/fsetpos中的#define#FILE _OFFSET(偏移量)位64不有用,因为它们只能返回到您已经访问过的位置,而不能搜索任意偏移量。使用fseeko/ftello(这些是POSIX而不是普通的C),并确保您的构建环境是64位文件偏移量,就像它看起来的那样。好的,让事情变得更复杂一点,我将用R发送整个混乱