我有一个用PHP编写的应用程序(在symfony上)导入大型CSV文件(最多100,000行)。它有一个真正的内存使用问题。一旦它通过大约15,000行,它就会停止运转。
我知道我可以在PHP中采取一些措施,但无论如何我已经完成了PHP。
如果我想编写一个导入CSV文件的应用程序,您认为Ruby和Python之间会有什么显着差异吗?是否其中一个面向更多与进口相关的任务?我意识到我正在基于非常少的信息提出一个问题。请随意让我澄清事情,或者只是说一般。
如果它有所不同,我真的很喜欢Lisp,如果可能的话,我更喜欢两种语言的Lispier。
答案 0 :(得分:10)
您要将CSV文件导入哪些内容?难道你不能以不会将整个内容一次加载到内存中的方式解析CSV文件(即一次只能使用一行)?
如果是这样,那么您可以使用Ruby的标准CSV库来执行以下“
之类的操作CSV.open('csvfile.csv', 'r') do |row|
#executes once for each row
p row
end
现在不要把这个答案作为切换到Ruby的直接原因。如果PHP在其CSV库中没有类似的功能,我会非常非常,所以在决定需要切换语言之前,你应该更彻底地研究PHP。
答案 1 :(得分:9)
您要将CSV文件导入哪些内容?难道你不能以不会将整个内容一次加载到内存中的方式解析CSV文件(即一次只能使用一行)?
如果是这样,那么您可以使用Python的标准csv
库来执行以下操作
import csv
with open('csvfile.csv', 'rb') as source:
rdr= csv.reader( source )
for row in rdr:
# do whatever with row
现在不要把这个答案作为切换到Python的直接原因。如果PHP在其CSV库等中没有类似的功能,我会感到非常惊讶。
答案 2 :(得分:3)
python中的等价物(等待它):
import csv
reader = csv.reader(open("some.csv", "rb"))
for row in reader:
print row
此代码不首先将整个csv文件加载到内存中,而是使用迭代器逐行解析它。我打赌你的问题是在“读取”行之后发生的,你在某种程度上缓冲数据(通过将其存储在某种字典或数组中)。
在处理bigdata时,您需要尽可能快地丢弃数据并尽可能缓冲。在上面的例子中,“print”正在这样做,对数据行执行某些操作但不存储/缓冲任何一个操作,因此python的GC可以在循环范围结束时立即取消该引用。
我希望这会有所帮助。
答案 3 :(得分:1)
我认为问题是您正在将csv一次加载到内存中。如果是这种情况,那么我确信python / ruby也会爆炸你。我是python的忠实粉丝,但这只是个人观点。