【问题标题】:Reducing CPU Utilization降低 CPU 使用率
【发布时间】:2023-03-27 04:30:02
【问题描述】:

我正在使用 python3.3,用于读取每个 20Mb 有 10 个文件的目录,我使用最多 10 个线程的线程池执行程序并提交要读取的文件。我一次读取一大块 1Mb,然后将所有文件中的每一行存储到线程安全列表中。当我查看顶部命令时,cpu 利用率非常高。 100% 高于任何降低 CPU 利用率的建议。下面是sn-p。

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 利用率的建议" - 是的,产生更少的线程!
  • 实际上,一个目录中也可能有超过 100 个文件,因此需要 10 个线程来进行快速处理。
  • 当您的问题是关于“降低 cpu 利用率”时,为什么您的问题的标题是“增加 CPU 利用率”?
  • 更改完成@selbie
  • 其实我把问题说成是标题@selbie

标签: python multithreading python-3.x cpu-usage


【解决方案1】:

尝试使用列表extend 方法,而不是重复 100 万个追加:

all_lines_list.extend(buff_lines)

而不是

for each_line in buff_lines:
    all_lines_list.append(each_line)

如果这不能减少您的工作量:您正在让您的计算机工作 - 10 次读取数据并存储在内存中 - 您需要完成工作 - 那么为什么担心它会占用一个内核的所有处理?如果您将其减少到 20%,您将在 5 倍的时间内完成您的工作。

您还有另一个问题,您在 Python3 中将文件作为 text 文件打开并读取特定数量的字符 - 这可能会使用一些 CPU,因为内部可能需要对每个文件进行解码字节来查找字符边界和行分隔符..
因此,如果您的文件未使用可变长度文本编码,例如 utf-8,则可能值得以二进制模式打开文件,然后对其进行解码(甚至可能值得将一些策略放入处理可变长度字符并将读取作为二进制文件的地方)

当然,您还可以在使用多处理而不是线程方面获得优势 - 这样您的程序将使用多个 CPU 内核来处理数据。但是,python 没有本机多进程共享列表对象 - 您需要使用 multiprocess.Valuemultiprocess.Array 对象创建自己的数据结构(并使用锁保持安全)。由于您无需对这些数据进行太多处理,而是将其添加到列表中,因此我认为这不值得。

【讨论】:

    【解决方案2】:

    每个线程都使用 CPU 时间来完成它的处理份额。要降低 CPU 使用率,请使用更少的线程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-03
      • 2023-01-03
      • 2016-06-11
      • 2012-11-16
      • 2018-12-13
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多