Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 降低CPU利用率_Python_Multithreading_Python 3.x_Cpu Usage - Fatal编程技术网

Python 降低CPU利用率

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)

我正在使用python3.3来读取一个目录,其中每个目录有10个20Mb的文件,我正在使用最多10个线程的线程池执行器并提交要读取的文件。我一次读取1Mb的数据块,然后将所有文件中的每一行存储到线程安全列表中。当我查看top命令时,cpu利用率非常高,大约比任何降低cpu利用率的建议都高100%。下面是片段

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