Ruby或Python用于繁重的导入脚本?

时间:2010-12-31 16:23:23

标签: php python ruby import lisp

我有一个用PHP编写的应用程序(在symfony上)导入大型CSV文件(最多100,000行)。它有一个真正的内存使用问题。一旦它通过大约15,000行,它就会停止运转。

我知道我可以在PHP中采取一些措施,但无论如何我已经完成了PHP。

如果我想编写一个导入CSV文件的应用程序,您认为Ruby和Python之间会有什么显着差异吗?是否其中一个面向更多与进口相关的任务?我意识到我正在基于非常少的信息提出一个问题。请随意让我澄清事情,或者只是说一般。

如果它有所不同,我真的很喜欢Lisp,如果可能的话,我更喜欢两种语言的Lispier。

4 个答案:

答案 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的忠实粉丝,但这只是个人观点。