将列表划分为大致相等的部分的最佳方法是什么?例如,如果列表有7个元素并将其拆分为2个部分,我们希望在一个部分中获得3个元素,而另一个应该具有4个元素.
我正在寻找像even_split(L, n)这样的东西L分成n几部分.
def chunks(L, n):
""" Yield successive n-sized chunks from L.
"""
for i in xrange(0, len(L), n):
yield L[i:i+n]
Run Code Online (Sandbox Code Playgroud)
上面的代码给出了3个块,而不是3个块.我可以简单地转置(迭代它并获取每列的第一个元素,调用第一部分,然后取第二部分并将其放入第二部分等),但这会破坏项目的顺序.
我想同时运行program.py的多个实例,同时限制同时运行的实例数(例如,我的系统上可用的CPU内核数).例如,如果我有10个内核并且总共需要运行1000次program.py,那么在任何给定时间只会创建并运行10个实例.
我已经尝试过使用多处理模块,多线程和使用队列,但在我看来似乎没有任何东西能够实现简单的实现.我遇到的最大问题是找到一种方法来限制同时运行的进程数.这很重要,因为如果我一次创建1000个进程,它就相当于一个fork炸弹.我不需要以编程方式从进程返回的结果(它们输出到磁盘),并且所有进程都彼此独立地运行.
任何人都可以给我一些建议或一个例子,说明如何在python中实现这一点,甚至是bash?我发布到目前为止我使用队列编写的代码,但它没有按预期工作,可能已经走错了路.
非常感谢.
假设我有一个非常大的文本文件,包含许多我想要反转的行.而且我不关心最终的订单.输入文件包含西里尔符号.我multiprocessing用来处理几个核心.
我写了这样的程序:
# task.py
import multiprocessing as mp
POOL_NUMBER = 2
lock_read = mp.Lock()
lock_write = mp.Lock()
fi = open('input.txt', 'r')
fo = open('output.txt', 'w')
def handle(line):
# In the future I want to do
# some more complicated operations over the line
return line.strip()[::-1] # Reversing
def target():
while True:
try:
with lock_read:
line = next(fi)
except StopIteration:
break
line = handle(line)
with lock_write:
print(line, file=fo)
pool = [mp.Process(target=target) for _ in range(POOL_NUMBER)]
for p in pool: …Run Code Online (Sandbox Code Playgroud) 在写入我通过将其传递给使用多处理实现的工作函数共享的打开文件时,文件内容未正确写入。相反 '^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@ ^@^@^@^@^@^@^@^@^' 写入文件。
为什么会发生这种情况?您不能将多个多处理单元写入同一个文件吗?你需要使用锁吗?队列?我是否没有正确或有效地使用多处理?
我觉得一些示例代码可能会有所帮助,但请仅将其作为我打开文件并通过多处理将打开的文件传递给另一个对该文件进行写入的函数的参考。
多处理文件:
import multiprocessing as mp
class PrepWorker():
def worker(self, open_file):
for i in range(1,1000000):
data = GetDataAboutI() # This function would be in a separate file
open_file.write(data)
open_file.flush()
return
if __name__ == '__main__':
open_file = open('/data/test.csv', 'w+')
for i in range(4):
p = mp.Process(target=PrepWorker().worker, args=(open_file,))
jobs.append(p)
p.start()
for j in jobs:
j.join()
print '{0}.exitcode = {1}' .format(j.name, j.exitcode)
open_file.close()
Run Code Online (Sandbox Code Playgroud) 我有一个程序,它需要一个非常庞大的输入文件,并从中产生一个字典.由于这不适合内存,我决定使用shelve将其写入我的磁盘.现在我需要利用我的系统中的多个核心(其中8个),这样我就可以加快解析速度.我认为最明显的方法是将输入文件分成8个部分,同时在所有8个部分上运行代码.问题是我最后只需要一本字典.不是8个.那么如何使用shelve并行更新单个字典呢?
我有这个 python 代码来读取一个文件,做一些处理并并行写入结果:
def line_chunker(path):
"""
Reads a file in chunks and yields each chunk.
Each chunk is guaranteed to end at a carriage return (EOL).
Each chunk is returned a single string.
The number of chunks the file is split into is equal to the number of CPU cores
available
"""
size = os.path.getsize(path)
cores = mp.cpu_count()
chunksize = size/cores # gives truncated integer
f = open(path)
s = f.readline() # skip header
while True:
part = f.readlines(chunksize)
if …Run Code Online (Sandbox Code Playgroud) python ×6
chunks ×1
eoferror ×1
file-writing ×1
list ×1
python-2.7 ×1
python-3.x ×1
queue ×1
shelve ×1