我正在建立一个网站,其基本前提是有两个文件。 index.php和file.txt。
File.txt有(目前)10megs的数据,这可能高达500mb。网站的想法是,人们去index.php,然后可以寻找文件的任何位置。另一个特点是它们可以从寻找点读取多达10kb的数据。所以:
index.php?pos=432
将获取文件位置423处的字节。
index.php?pos=555&len=5000
将从位置555开始从文件中获取5kb的数据
现在,想象一下该网站每天会有数千次点击。
我目前使用fseek
和fread
来提供数据。有没有更快的方法呢?或者我的使用率太低而无法考虑高级优化,例如缓存每个请求的结果或将文件加载到内存中并从那里读取它?
答案 0 :(得分:0)
每天有数千次点击,就像每隔几秒一次?这肯定太低了,不需要在此时进行优化,所以只要使用fseek和fread,如果这对你来说最简单。
答案 1 :(得分:0)
如果您将所有数据保存到文件中至关重要,我建议您将文件拆分为一小块较小的文件。
例如,您可以做出决定,文件大小不应超过1 MB。这意味着您必须将file.txt
文件拆分为10个单独的文件:file-1.txt
,file-2.txt
,file-3.txt
等等......
当您处理请求时,您需要确定要通过文件大小的pos
分区来获取的文件,并显示适当的数据量。在这种情况下,fseek
函数可以更快地工作,也许......
但无论如何,你必须坚持使用fseek
和fopen
函数。
答案 2 :(得分:0)
编辑 :现在我认为,只要您使用fseek()
转到字节偏移量然后使用fread()
获取一定数量的字节它应该不是问题。出于某种原因,我把你的问题看作是从一个非常糟糕的文件中提供X个行的。
问题是你绝对使用IO操作锤击磁盘,并且你不仅仅是因为这个文件/脚本导致性能问题,而是因为任何需要它的东西都会导致性能问题磁盘。其他用户,操作系统等,如果你在共享主机上我保证其中一个系统管理员试图找出你是谁,这样他们就可以拒绝你。 [我会]
你需要找到一种方法:
将其卸载到更高效的地方,例如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;
答案 3 :(得分:0)
如果文件永远不会更改,并且真正受限于最大大小,我只需安装ramdisk,并拥有一个启动脚本,将文件从永久存储器复制到RAM存储器。
这可能需要在Linux上托管网站,如果你还没有。
这样可以保证文件段是从内存中提供的,而不依赖于OS文件系统缓存。