php 大文件操作

hujianreplace 2014-07-15 11:15:56
场景:
一个大文件,存放500W条记录,存放方式类似数据库中存数据方式, 每个列用TAB分隔,有一个关键字段是不重复的值,如何根据这个关键字段,快速获得该条记录。
数据存放格式:
1 童五 68
2 郭八 84
3 仲七 44
4 马九 22
5 家一 69
6 钦五 15
7 方二 96
8 通二 53
9 刘十 29

一句话概况就是, 用文件管理的方式,模拟数据库主键索引。
...全文
181 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
openweb 2014-07-16
  • 打赏
  • 举报
回复
都500W数据了还用文件方式?为什么不想办法改善服务器?哪怕用个dbf或mdb的数据库也行啊
  • 打赏
  • 举报
回复
基于key-value的固定存储,可以用redis实现, 如果不是那么考虑效率的话,可以试试用awk,不至于特别慢。
冷月清晖 2014-07-16
  • 打赏
  • 举报
回复
每次系统启动的时候把数据从文件读取到内存,在系统运行过程中就不要写文件了,全部在内存里操作吧。 做好异常处理:定时增量写文件。
深圳phper 2014-07-15
  • 打赏
  • 举报
回复
床上等您 2014-07-15
  • 打赏
  • 举报
回复
引用 3 楼 hujianreplace 的回复:
[quote=引用 1 楼 yangball 的回复:] 能不能预先把这文件的数据,放到db里呢??
那就直接操作DB了。 不用操作文件了。[/quote] 当然了,关键是你的文件在你的场景中能存入db中不
hujianreplace 2014-07-15
  • 打赏
  • 举报
回复
引用 1 楼 yangball 的回复:
能不能预先把这文件的数据,放到db里呢??
那就直接操作DB了。 不用操作文件了。
ayzen1988 2014-07-15
  • 打赏
  • 举报
回复
如果数据不删、唯一标识是递增的情况下;直接搜索文件第N行
床上等您 2014-07-15
  • 打赏
  • 举报
回复
能不能预先把这文件的数据,放到db里呢??
猪崽儿0o0 2014-07-15
  • 打赏
  • 举报
回复
引用 9 楼 hujianreplace 的回复:
[quote=引用 6 楼 u011619326 的回复:] 发表一点比较不切实际的想法:下面是我胡说的,你可以把这个文件按照行切割成一条条的数据然后让一条数据切割成一维数组然后变成数组查找,只是一个愚蠢的想法,实现起来难度有点大,而且执行效率不好说。
实现不难,只是效率太低。 生成个500W元素的数组,内存占很多。 生成这个数组花的时间也很长。10秒以上估计[/quote]好的吧,期待有更好的方法,我就那么一说。
傲雪星枫 2014-07-15
  • 打赏
  • 举报
回复
可否用linux grep 命令找到該行,然後直接獲取該行數據呢? 這樣會比php快很多的。
hujianreplace 2014-07-15
  • 打赏
  • 举报
回复
引用 6 楼 u011619326 的回复:
发表一点比较不切实际的想法:下面是我胡说的,你可以把这个文件按照行切割成一条条的数据然后让一条数据切割成一维数组然后变成数组查找,只是一个愚蠢的想法,实现起来难度有点大,而且执行效率不好说。
实现不难,只是效率太低。 生成个500W元素的数组,内存占很多。 生成这个数组花的时间也很长。10秒以上估计
xuzuning 2014-07-15
  • 打赏
  • 举报
回复
楼主要求的是文件方式,所以其他方案不应被采用 显然第一列是唯一的,因为那是一个序号 由于列间是制表符分隔的,所以每行长度不会是固定的(如果是定长数据,处理起来要简单些) 于是你需要创建一个索引文件,方法如下:
$fp = fopen($filename, ‘r');
$t = 0;
while($buf = fgets($fp)) {
  $ind[strtok($buf, "\t")] = $t;
  $t = ftell($fp);
}
fclose($fp);
这样就得到了一个每个序号在文件中的位置的数组,排序后可写入定长记录文件中(索引文件) 使用时先用二分法在索引文件中找到指定序号在数据文件中的位置 500万最多折腾22次就找到了 然后在数据文件中 fseek 定位的查到的位置,fgets 读取对应的行 500万数据的索引放在数组中也是可接受的,不过 memory_limit 要大于 500M
冷却 2014-07-15
  • 打赏
  • 举报
回复
这些数据可以放到xml文件中吗
猪崽儿0o0 2014-07-15
  • 打赏
  • 举报
回复
发表一点比较不切实际的想法:下面是我胡说的,你可以把这个文件按照行切割成一条条的数据然后让一条数据切割成一维数组然后变成数组查找,只是一个愚蠢的想法,实现起来难度有点大,而且执行效率不好说。

21,887

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧