我有大约1.5 Gb的文件,我想将文件分成块,以便我可以使用多处理来使用python中的pp(并行python)模块处理每个块。直到现在我已经在python中使用了f.seek但是它需要花费很多时间,因为它可能会逐字节地寻求增量。那么什么可以替代方式呢? 我可以通过python的mrjob(map-reduce包)来做到这一点吗?
示例代码:我正在做这样的事情
def multi(i,slots,,file_name,date):
f1=open(date+'/'+file_name,"rb")
f1.seek(i*slots*69)
data=f1.read(69)
counter=0
print 'process',i
while counter<slots:
##do some processing
counter+=1
data=f1.read(69)
我的每一行都包含一个69字节的tupple数据,而且多功能被并行调用(这里n等于插槽)来完成这项工作
答案 0 :(得分:1)
为什么不打开文件的多个句柄?这样,你只需要寻找&#39;每手一次。
f1 = open('file')
f2 = open('file')
f2.seek(100) # in practice the number would be <file size>/<no of threads>
f3 = open('file')
f3.seek(200)
答案 1 :(得分:1)
最简单的方法是使用一个读取记录并返回记录的通用函数。但该功能受锁保护。像下面这样的东西。请注意,我不是Python程序员,因此您必须解释我的伪代码。
f = open file
l = new lock
function read
acquire lock
read record
release lock
return record
现在,启动几个线程,但只有你有处理器核心,每个都执行此操作:
while not end of file
record = read();
process record
因此,不是为每条记录启动一个新线程,而是拥有一些持久性线程。
另一种方法是将线程专用于阅读。它读取记录并将它们放入线程安全的队列中。队列限制在某种程度(100条记录,10,000条记录,无论如何)。处理线程从该队列中读取。此方法的优点是读取线程可以在其他线程正在处理时填充队列。然后处理线程可以非常快速地获得下一条记录。