各位对于超大型的文本文件是如何处理的? 如果不考虑客户端的贷款问题,那应该使用ajax了。很好的例子啊几十M的XML,怎么说还是太大了,尽量不处理这样的东西。效率比处理数据库还慢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你现在弄个十几M的TXT,打开看看什么效果,然后决定要不要用十几M的XML! 呵呵,这个xml不是现在制作出来的,是一些历史数据 大文件处理不可能全读入内存中再处理 ,你如果想提高查找速度,保存文件时就把ID按顺序排列,可以按下面方法来查找, 申明变量 总记录数lngCount,目前记录lngThis,偏移量lngOffset,要找的ID lngFindID ,当前ID , lngThisID1先读出总记录数lngCount , lngOffset=lngCount /2 ,lngThis = 0 2 lngThis=lngThis + lngOffset3 如果 lngThis< 1 或 lngThis>lngCount 没有ID为lngFindID的数据3 读入第(lngThis )条,得到lngThisID4如果 lngThisID < lngFindID 那么 lngOffset = lngOffset / 2 5如果 lngThisID > lngFindID 那么 lngOffset =-1* ( lngOffset / 2)6如果 lngThisID =lngFindID 那么,OK,你要找的就是这条数据7 重复第二步我以前做过,不过是用VB做的,只能给你思路,不好意思, 如果数据排序是乱的,你只能读一条比较一条, 小文件怎么处理,大文件就怎么处理吧。我曾经导出过一个 mysql 的表,一百多兆, phpmyadmin 根本导入不了。最后 fopen ,然后一行一行的读.一行一行的 mysql_query 导入,速度并不慢。不要想着去 什么内存映射, 分块读入之类的问题, 这些技术优化不用你做,而且你用php也不一定做得了。 那些是当你使用 C/C++ 语言的时候要考虑的问题。php 的函数都是 c 语言写的。 他们在写这些函数的时候都已经考虑过对超大文件进行内存映射,分块读入之类的算法优化了,我们直接拿着用就是。附上一段 file_get_contents 的注释和 file() 一样,只除了 file_get_contents() 把文件读入一个字符串。将在参数 offset 所指定的位置开始读取长度为 maxlen 的内容。如果失败,file_get_contents() 将返回 FALSE。 file_get_contents() 函数是用来将文件的内容读入到一个字符串中的首选方法。如果操作系统支持还会使用内存映射技术来增强性能。 手册里面已经写得很清楚,已经帮你用内存映射技术来增强性能了 对于大文件,我们能做而且最有效的就是设置 set_time_limit。别让脚本超时就ok 分块、拼装(如果没有上G的话)上G:内存中映射;不同的操作系统有不同的支持底线,如果要拼装几十G我看就不现实了。 才几十MB,米点影响...在LINUX下,几百MB的日志文件打开和打开1MB的没多少差异 文件的大小本身不是问题, file_get_contents象上面说的一样本身使用了内存映射,不用操心内容的问题.关键是文件的检索速度慢, 那么解决办法无非是1. 转入数据库处理2. 自己做个索引文件 autoload函数,无法预期的EOF问题 如何点击一个文本框后全选中? php如何传递map类型给JAVA webservice,求高手看下为什么JAVA服务端接收不到参数 问什么换到服务器上 gd库就生成不了图片了 PHP怎么解决输入框内容含有 \ ' " 等字符的问题 0000-00-00 00:00:00 ubb编辑器中的redo和undo应该怎么实现,急!!! 关于PHP读取XML WEB SERVER内容的问题。。 win2k3下面可否安装vss的? 尖端问题 请问如何把一个纯html的文件改写成php格式的? 已经用include包含进来php文件,能再把他去除掉吗
申明变量 总记录数lngCount,目前记录lngThis,偏移量lngOffset,要找的ID lngFindID ,当前ID , lngThisID
1先读出总记录数lngCount , lngOffset=lngCount /2 ,lngThis = 0
2 lngThis=lngThis + lngOffset
3 如果 lngThis< 1 或 lngThis>lngCount 没有ID为lngFindID的数据
3 读入第(lngThis )条,得到lngThisID
4如果 lngThisID < lngFindID 那么 lngOffset = lngOffset / 2
5如果 lngThisID > lngFindID 那么 lngOffset =-1* ( lngOffset / 2)
6如果 lngThisID =lngFindID 那么,OK,你要找的就是这条数据
7 重复第二步
我以前做过,不过是用VB做的,只能给你思路,不好意思, 如果数据排序是乱的,你只能读一条比较一条,
最后 fopen ,然后一行一行的读.
一行一行的 mysql_query 导入,速度并不慢。
不要想着去 什么内存映射, 分块读入之类的问题, 这些技术优化不用你做,而且
你用php也不一定做得了。 那些是当你使用 C/C++ 语言的时候要考虑的问题。php 的函数都是 c 语言写的。 他们在写这些函数的时候都已经考虑过对超大文件进行
内存映射,分块读入之类的算法优化了,我们直接拿着用就是。
附上一段 file_get_contents 的注释和 file() 一样,只除了 file_get_contents() 把文件读入一个字符串。将在参数 offset 所指定的位置开始读取长度为 maxlen 的内容。如果失败,file_get_contents() 将返回 FALSE。 file_get_contents() 函数是用来将文件的内容读入到一个字符串中的首选方法。如果操作系统支持还会使用内存映射技术来增强性能。
手册里面已经写得很清楚,已经帮你用内存映射技术来增强性能了
上G:内存中映射;
不同的操作系统有不同的支持底线,如果要拼装几十G我看就不现实了。
在LINUX下,几百MB的日志文件打开和打开1MB的没多少差异
关键是文件的检索速度慢, 那么解决办法无非是
1. 转入数据库处理
2. 自己做个索引文件