如何高效的分割一个数组

2014-07-03 13:11:07 +08:00
 atan
现有一个大约50W行的文本文件,使用 `file('file.txt')` 取出内容后,需要按50个一组存入数据库,基本想法是用array_chunk分割后json_encode写入数据库,但是array_chunk一操作就提示内存超出上限,我知道PHP本身数组的内存效率就不高,有什么办法在不增加内存的情况下高效的分割这个文件?
PS: memory_limit = 128M
3188 次点击
所在节点    PHP
13 条回复
TimeLe
2014-07-03 13:14:17 +08:00
边读取 边入库操作 可否?
breeswish
2014-07-03 13:15:55 +08:00
按行读取文件内容,每读满50个就存进去

不要一次性全读入再一次性全分割再一次性存进去..&#$^@(*
atan
2014-07-03 13:17:10 +08:00
@TimeLe 谢谢,这个我试过,但效率很低,而且内存占用很高
shiny
2014-07-03 13:18:00 +08:00
边读边入库+1,可以考虑 fgets,文件大的时候很有用。
atan
2014-07-03 13:25:35 +08:00
@shiny
@breeswish 谢谢,试试看去
bearcat001
2014-07-03 13:47:02 +08:00
1. 大文件都是按行读的,读够50条,将50条写成一条SQL存入数据库
2. 或者边读边写生成一个格式化的文件文件用LOAD DATA来存入数据库
TimeLe
2014-07-03 13:51:25 +08:00
@bearcat001 LZ貌似说这种效率底下 内存占用高
bearcat001
2014-07-03 14:02:21 +08:00
@TimeLe 方法1是最省内存的,1+50的内存占用,存储效率适中
方法2只需要1的占用,存储效率较高

我之前测试过这几种方法,具体看这里
http://yansu.org/2014/04/16/insert-large-number-of-data-in-mysql.html
Tonni
2014-07-03 14:08:48 +08:00
楼主博客主题是什么?
TimeLe
2014-07-03 15:37:31 +08:00
@bearcat001 恩.已看 顺便博客写的不错
atan
2014-07-03 15:52:51 +08:00
@Tonni Typecho 默认就是这个样子的
Actrace
2014-07-04 00:15:03 +08:00
打开文件句柄后使用fseek手动完成行切操作,这样你就可以控制每次读入的长度,并且不占用大量内存。
xieranmaya
2014-07-05 11:52:08 +08:00
才50万行,一边读一边写,用py啊,分分钟就ok了。
我做过5万多行的,需求跟你一模一样,不过一行特别长,文件总大小100M+,几秒钟就搞定了
还有py代码呢,我来找找

import os
import sys
import platform

print(platform.python_version())
lpf = 4000 # line per file
bigfile = open('bigfile.txt',encoding='utf8')
part = 10 # 为了文件名长度一致
while True:
parts = open(str(part)+'.dat','w',encoding='utf8')
part += 1
for i in range(0,lpf):
line = bigfile.readline()
if not line:
parts.close()
bigfile.close()
sys.exit()
parts.write(line)
parts.close()

bigfile.close()

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/120767

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX