我需要在python中获取大文件(数十万行)的行数.记忆和时间方面最有效的方法是什么?
目前我这样做:
def file_len(fname):
with open(fname) as f:
for i, l in enumerate(f):
pass
return i + 1
Run Code Online (Sandbox Code Playgroud)
有可能做得更好吗?
我有一些非常大的文本文件需要处理,最大的是大约60GB.
每行在七个字段中有54个字符,我想从前三个字段中删除最后三个字符 - 这应该将文件大小减少大约20%.
我是Python的新手,并且有一个代码可以按照每小时大约3.4 GB的速度完成我想做的事情,但是我需要获得至少10 GB /小时的有价值的练习 - 有没有办法加速这个?这段代码并没有接近挑战我的处理器,所以我做了一个没有受过教育的猜测,它受到内部硬盘读写速度的限制?
def ProcessLargeTextFile():
r = open("filepath", "r")
w = open("filepath", "w")
l = r.readline()
while l:
x = l.split(' ')[0]
y = l.split(' ')[1]
z = l.split(' ')[2]
w.write(l.replace(x,x[:-3]).replace(y,y[:-3]).replace(z,z[:-3]))
l = r.readline()
r.close()
w.close()
Run Code Online (Sandbox Code Playgroud)
任何帮助将非常感激.我在Windows 7上使用IDLE Python GUI并拥有16GB的内存 - 也许一个不同的操作系统会更有效率?
编辑:这是要处理的文件的摘录.
70700.642014 31207.277115 -0.054123 -1585 255 255 255
70512.301468 31227.990799 -0.255600 -1655 155 158 158
70515.727097 31223.828659 -0.066727 -1734 191 187 180
70566.756699 31217.065598 -0.205673 -1727 254 255 255
70566.695938 …Run Code Online (Sandbox Code Playgroud) 我有三个巨大的文件,只有2列,我需要两个.我想将它们合并到一个文件中,然后我可以将其写入SQLite数据库.
我使用Python并完成了工作,但是花了大约30分钟,我的系统还挂了10个.我想知道是否有更快的方法使用awk或任何其他unix工具.Python中更快的方式也会很棒.代码如下:
'''We have tweets of three months in 3 different files.
Combine them to a single file '''
import sys, os
data1 = open(sys.argv[1], 'r')
data2 = open(sys.argv[2], 'r')
data3 = open(sys.argv[3], 'r')
data4 = open(sys.argv[4], 'w')
for line in data1:
data4.write(line)
data1.close()
for line in data2:
data4.write(line)
data2.close()
for line in data3:
data4.write(line)
data3.close()
data4.close()
Run Code Online (Sandbox Code Playgroud) 这是前一个问题的后续问题.
考虑一下这个代码,它比前一个问题中的代码少一些(但仍然比我真实的简单得多)
import sys
data=[]
for line in open(sys.argv[1]):
data.append(line[-1])
print data[-1]
Run Code Online (Sandbox Code Playgroud)
现在,我期待更长的运行时间(我的基准文件长度为65150224行),可能更长.事实并非如此,它与以前一样在约2分钟内运行!
是data.append()非常轻量级?我不相信,因此我写了这个假代码来测试它:
data=[]
counter=0
string="a\n"
for counter in xrange(65150224):
data.append(string[-1])
print data[-1]
Run Code Online (Sandbox Code Playgroud)
这运行时间为1.5到3分钟(运行之间存在很大的差异)
为什么我不能在前一个程序中获得3.5到5分钟?显然,data.append()与IO并行发生.
这是个好消息!
但它是如何工作的?它是一个记录的功能吗?我的代码是否有任何要求我应该遵循以使其尽可能地工作(除了负载平衡IO和内存/ CPU活动)?或者只是简单的缓冲/缓存?
再次,我在这个问题上标记了"linux",因为我只对linux特定的答案感兴趣.如果您认为值得做,请随意提供与操作系统无关的内容,甚至其他操作系统的答案.