重数据导入脚本选择Ruby还是Python?

2 投票
4 回答
1005 浏览
提问于 2025-04-16 09:15

我有一个用PHP(在symfony框架上)写的应用程序,它需要导入很大的CSV文件(最多可以有100,000行)。这个程序在内存使用上有个大问题。一旦处理到大约15,000行时,就会变得非常慢,几乎无法继续。

我知道在PHP中有一些可以采取的措施,但我对PHP已经有点厌倦了。

如果我想写一个导入CSV文件的应用程序,你觉得Ruby和Python之间会有什么显著的区别吗?这两种语言中有没有哪一种更适合处理导入相关的任务?我意识到我问的问题信息很少。如果需要的话,可以问我更多细节,或者就简单聊聊。

如果有影响的话,我其实很喜欢Lisp,如果可以的话,我更倾向于选择那种更像Lisp的语言。

4 个回答

3

在Python中,类似的做法是这样的:

import csv
reader = csv.reader(open("some.csv", "rb"))
for row in reader:
    print row

这段代码不会一次性把整个csv文件都加载到内存里,而是逐行读取,使用迭代器来处理。我敢打赌,你的问题出现在读取完一行之后,可能是因为你在某个地方把数据存起来了(比如放在字典或数组里)。

处理大数据时,你需要尽量快地丢弃数据,尽量少地缓存。在上面的例子中,“print”就是在做这个,它对每一行数据进行操作,但并不存储或缓存任何数据,这样Python的垃圾回收机制就能在循环结束后立即处理掉这些引用。

希望这对你有帮助。

10

你是把CSV文件导入到哪里呢?难道不能用一种方法解析CSV文件,这样就不需要一次性把整个文件都加载到内存中吗?也就是说,可以一行一行地处理?

如果可以的话,你可以使用Ruby的标准CSV库来做类似下面的事情:

CSV.open('csvfile.csv', 'r') do |row|
  #executes once for each row
  p row
end

不过,不要因为这个答案就立刻决定要换成Ruby。我会非常惊讶如果PHP的CSV库没有类似的功能,所以在决定要换语言之前,你应该更仔细地研究一下PHP。

10

你是把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库没有类似的功能等等。

撰写回答