Python 降低CPU利用率
我正在使用python3.3来读取一个目录,其中每个目录有10个20Mb的文件,我正在使用最多10个线程的线程池执行器并提交要读取的文件。我一次读取1Mb的数据块,然后将所有文件中的每一行存储到线程安全列表中。当我查看top命令时,cpu利用率非常高,大约比任何降低cpu利用率的建议都高100%。下面是片段Python 降低CPU利用率,python,multithreading,python-3.x,cpu-usage,Python,Multithreading,Python 3.x,Cpu Usage,我正在使用python3.3来读取一个目录,其中每个目录有10个20Mb的文件,我正在使用最多10个线程的线程池执行器并提交要读取的文件。我一次读取1Mb的数据块,然后将所有文件中的每一行存储到线程安全列表中。当我查看top命令时,cpu利用率非常高,大约比任何降低cpu利用率的建议都高100%。下面是片段 all_lines_list = [] while True: with concurrent.futures.ThreadPoolExecutor(max_workers=10)
all_lines_list = []
while True:
with concurrent.futures.ThreadPoolExecutor(max_workers=10) as executor:
for each_file in file_list:
executor.submit(trigger, each_file)
def trigger(filename):
with open(filename, "r")as fp:
buff = fp.read(1000000)
buff_lines = buff.split('\n')
time.sleep(0.2)
for each_line in buff_lines:
all_lines_list.append(each_line)
每个线程都使用CPU时间来完成自己的部分处理。要降低CPU利用率,请使用较少的线程。尝试使用list
extend
方法,而不是重复一百万个附录:
all_lines_list.extend(buff_lines)
而不是
for each_line in buff_lines:
all_lines_list.append(each_line)
如果这不能减少你的工作量:你正在让你的计算机工作——10倍于读取数据和存储在内存中——你需要完成这些工作——那么为什么还要担心它需要一个核心的所有处理?如果你把它减少到20%,你将在5倍的时间内完成你的工作
您还有一个问题,就是在Python3中以文本文件的形式打开文件并读取特定数量的字符-这可能需要一些CPU,因为内部可能需要解码每个字节以查找字符边界和行分隔符。因此,如果您的文件未使用可变长度的文本编码(如utf-8),则可能值得以二进制模式打开文件,然后对其进行解码(甚至可能值得采取一些策略来处理可变长度字符,并将读取作为二进制文件)
当然,在使用多处理而不是线程方面,您也可以获得优势——这样,您的程序将使用多个CPU内核来处理数据。但是,python没有本机多进程共享列表对象-您需要使用
multiprocess.Value
和multiprocess.Array
对象创建自己的数据结构(并使用锁确保其安全)。由于您没有太多的数据要处理,但要将其添加到列表中,我认为这是不值得的。“任何降低cpu利用率的建议”-是的,生成的线程更少!实际上,一个目录中可能也有100多个文件,因此需要10个线程才能进行快速处理。当您的问题是“降低CPU利用率”时,为什么您的问题标题是“提高CPU利用率”?更改完成@selbie实际上我将问题的起因表述为标题@selbie