这是我的问题:我在HDFS中有一个文件,该文件可能很大(=不足以容纳所有内存)
我想做的是避免必须将此文件缓存在内存中,而仅像逐行处理常规文件一样逐行处理它:
for line in open("myfile", "r"): # do some processing
我正在寻找是否有一种简单的方法可以在不使用外部库的情况下正确完成此操作。我可能可以使它与libpyhdfs或python- hdfs一起使用,但我想尽可能避免在系统中引入新的依赖项和未经测试的库,尤其是因为这两个似乎都没有得到大量维护,并声明不应用于生产。
我当时在考虑使用Pythonsubprocess模块使用标准的“ hadoop”命令行工具来执行此操作,但是由于没有命令行工具可以进行处理,因此我似乎无法执行所需的操作,并且我想以流式方式为每行执行Python函数。
subprocess
有没有一种方法可以使用subprocess模块将Python函数用作管道的正确操作数?甚至更好,像打开文件一样将其作为生成器打开,这样我就可以轻松地处理每一行?
cat = subprocess.Popen(["hadoop", "fs", "-cat", "/path/to/myfile"], stdout=subprocess.PIPE)
如果有另一种方法可以在不使用外部库的情况下实现上述功能,那么我也很开放。
谢谢你的帮助 !
您需要xreadlines,它可以从文件读取行而不将整个文件加载到内存中。
编辑 :
现在,我看到了您的问题,您只需要从Popen对象中获取stdout管道即可:
Popen
cat = subprocess.Popen(["hadoop", "fs", "-cat", "/path/to/myfile"], stdout=subprocess.PIPE) for line in cat.stdout: print line