0

我正在建立一个网站,其基本前提是有两个文件。index.php 和 file.txt。

File.txt(当前)有 10 兆的数据,这可能高达 500 mb。该站点的想法是,人们访问 index.php,然后可以查找文件的任何位置。另一个特点是他们可以从搜索点读取多达 10kb 的数据。所以:

index.php?pos=432将获得文件位置 423 的字节。

index.php?pos=555&len=5000将从位置 555 开始的文件中获取 5kb 的数据

现在,想象一下该网站每天获得数千次点击。

我目前使用fseekfread提供数据。有没有更快的方法来做到这一点?还是我的使用量太低而无法考虑高级优化,例如缓存每个请求的结果或将文件加载到内存中并从那里读取?

4

4 回答 4

0

如果将所有数据保存到文件中对您来说至关重要,我建议您将文件拆分为一小块较小的文件。

因此,例如,您可以决定文件大小不应超过 1 mb。这意味着您必须将file.txt文件拆分为 10 个单独的文件:file-1.txtfile-2.txtfile-3.txt...

当您处理请求时,您需要通过pos文件大小的除法参数确定要拾取的文件并显示适当的数据量。在这种情况下fseek,功能会运行得更快,也许......

但无论如何,您必须坚持使用fseekfopen功能。

于 2013-08-02T19:08:16.740 回答
0

编辑:现在我考虑到了,只要您使用fseek()转到字节偏移量然后使用fread()获取一定数量的字节,这应该不是问题。出于某种原因,我将您的问题读作从文件中提供 X,这真的很糟糕。


问题是您绝对是在使用 IO 操作敲打磁盘,而且您不仅会导致这个文件/脚本出现性能问题,还会导致需要该磁盘的任何东西出现性能问题。其他用户、操作系统等,如果您在共享主机上,我保证其中一位系统管理员正试图找出您是谁,以便他们可以关闭您。[我会]

您需要找到一种方法:

  1. 将此卸载到内存中。
    在服务器上设置一个守护进程,将文件加载到内存中并根据请求提供块。
  2. 将其卸载到更高效的东西上,例如 mySQL。
    您已经在按顺序提供数据,例如:第 466 到 476 行,从如下表中检索数据会快得多:

    CREATE TABLE mydata (
      line INTEGER NOT NULL AUTO_INCREMENT,
      data VARCHAR(2048)
    ) PRIMARY KEY (line);
    

    经过:

    SELECT data FROM mydata WHERE line BETWEEN 466 AND 476;
    
于 2013-08-02T19:15:31.977 回答
0

如果文件永远不会更改,并且最大大小确实受到限制,我只需安装一个ramdisk,并有一个引导脚本将文件从永久存储复制到 RAM 存储。

如果您还没有,这可能需要在 linux 上托管该站点。

这将允许您保证文件段是从内存中提供的,而不依赖于 OS 文件系统缓存。

于 2013-08-02T19:24:25.517 回答
0

每天上千次点击,就好像每隔几秒就有一次?在这一点上,这绝对太低了,不需要优化,所以如果这对你来说最简单的话,只需使用 fseek 和 fread 即可。

于 2013-08-02T19:03:36.060 回答