我正在使用python3.3,用于读取每个20Mb有10个文件的目录,我使用最多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)
答案 0 :(得分:0)
尝试使用列表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.Value
和multiprocess.Array
对象创建自己的数据结构(并使用锁保持安全)。由于您没有太多处理这些数据但是要将其添加到列表中,我认为这不值得付出努力。
答案 1 :(得分:-1)
每个线程使用CPU时间来完成其处理份额。要降低CPU利用率,请使用更少的线程。