Rails中file.readlines与file.gets的内存占用对比(SFTP大文件场景)
两种SFTP大文件读取方式的内存占用对比
毫无疑问,方式2(while line = f.gets do)的内存表现要远远优于方式1,原因很直观:
方式1的内存瓶颈:
f.readlines会一次性把整个文件的所有行全部加载到内存中,生成一个包含所有行字符串的数组。对于10万+行的大文件来说,这个数组会直接占据大量内存——哪怕每行平均只有100个字符,10万行就是近10MB的纯文本数据,再加上Ruby字符串对象本身的额外开销,实际内存占用会更高。如果文件后续增长到百万行级别,这种方式很可能直接导致内存不足(OOM),拖慢整个程序甚至让它崩溃。方式2的内存优势:
f.gets是逐行流式读取,每次只从文件中加载一行数据到内存。当你处理完这一行(比如调用parse(line))后,只要没有其他代码持有这个字符串的引用,Ruby的垃圾回收机制就会自动释放这一行占用的内存。整个过程中,内存占用会维持在一个非常低的稳定水平,不管文件有多大(只要单一行的内存能被正常处理),都不会出现内存暴涨的情况。
如果你想直观验证这个差异,可以在两种方式的执行过程中,用ps命令查看进程的内存占用,或者在Ruby代码里加入GC.stat的输出,对比两者的内存使用峰值——你会发现方式1的内存峰值是方式2的几十甚至上百倍。
对于你这种处理10万+行SFTP大文件的场景,方式2显然是更合理的选择,既能保证内存高效利用,也能避免因大内存占用带来的性能问题。
内容的提问来源于stack exchange,提问作者Remy Wang
相关产品推荐
相关产品推荐

