0

我有大约 1.5 Gb 的文件,我想将文件分成块,以便我可以使用多处理来使用 python 中的 pp(parallel 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 字节的元组数据,并且 Multi 函数被称为并行 n 时间(这里 n 等于槽)来完成这项工作

4

2 回答 2

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 条记录等)。处理线程从该队列中读取。这种方法的优点是读取线程可以在其他线程处理的同时填满队列。然后处理线程可以非常快速地获得下一条记录。

于 2014-03-03T14:07:57.487 回答
1

为什么不打开文件的多个句柄?这样,每个句柄只需要“寻找”一次。

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)
于 2014-03-03T10:19:14.827 回答