重数据导入脚本选择Ruby还是Python?
我有一个用PHP(在symfony框架上)写的应用程序,它需要导入很大的CSV文件(最多可以有100,000行)。这个程序在内存使用上有个大问题。一旦处理到大约15,000行时,就会变得非常慢,几乎无法继续。
我知道在PHP中有一些可以采取的措施,但我对PHP已经有点厌倦了。
如果我想写一个导入CSV文件的应用程序,你觉得Ruby和Python之间会有什么显著的区别吗?这两种语言中有没有哪一种更适合处理导入相关的任务?我意识到我问的问题信息很少。如果需要的话,可以问我更多细节,或者就简单聊聊。
如果有影响的话,我其实很喜欢Lisp,如果可以的话,我更倾向于选择那种更像Lisp的语言。
4 个回答
在Python中,类似的做法是这样的:
import csv
reader = csv.reader(open("some.csv", "rb"))
for row in reader:
print row
这段代码不会一次性把整个csv文件都加载到内存里,而是逐行读取,使用迭代器来处理。我敢打赌,你的问题出现在读取完一行之后,可能是因为你在某个地方把数据存起来了(比如放在字典或数组里)。
处理大数据时,你需要尽量快地丢弃数据,尽量少地缓存。在上面的例子中,“print”就是在做这个,它对每一行数据进行操作,但并不存储或缓存任何数据,这样Python的垃圾回收机制就能在循环结束后立即处理掉这些引用。
希望这对你有帮助。
你是把CSV文件导入到哪里呢?难道不能用一种方法解析CSV文件,这样就不需要一次性把整个文件都加载到内存中吗?也就是说,可以一行一行地处理?
如果可以的话,你可以使用Ruby的标准CSV库来做类似下面的事情:
CSV.open('csvfile.csv', 'r') do |row|
#executes once for each row
p row
end
不过,不要因为这个答案就立刻决定要换成Ruby。我会非常惊讶如果PHP的CSV库没有类似的功能,所以在决定要换语言之前,你应该更仔细地研究一下PHP。
你是把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库没有类似的功能等等。