项目场景:
之前碰到过的一个问题:1亿个整型数据,进行排序。我本来打算用几种排序算法试试看它们的处理时间,结果需要打印出来。
问题描述
完成排序后,将排序结果打印时出现error。
BrokenPipeError: [Errno 32] Broken pipe
堆排序算法及主函数如下
import time
from functools import wraps
import numpy as np
def Decorator(func):
@wraps(func)
def runtime(*args, **kwargs):
begin = time.time()
func(*args, **kwargs)
end = time.time()
print("{} fuction's runtime is :{}".format(func,end-begin))
return runtime
def BuildMaxHeap(array, length):
# 建立大根堆
for i in range(length//2, 0, -1):
HeadAdjust(array, i, length)
def HeadAdjust(array, k, length):
# 将元素k为根的子树进行调整
temp = array[k]
i = 2*k
while i<=length:
if i<length and array[i] < array[i+1]:
i += 1
if temp > array[i]:
break
else:
array[k] = array[i]
k = i
i *= 2
array[k] = temp
@Decorator
def Heap_sort(array,length):
# 堆排序
# 将list元素整体后移一位
array.append(0)
for i in range(length-1,-1,-1):
array[i+1] = array[i]
BuildMaxHeap(array,length) # 构建初始堆
for i in range(length,1,-1):
array[i], array[1] = array[1], array[i] # 输出堆顶元素
HeadAdjust(array,1,i-1) # 调整
# 将list元素整体向前移一位
for i in range(length):
array[i] = array[i+1]
array.pop() # 删除末尾元素
if __name__ == "__main__":
array = list(np.random.randint(0,10000000,100000000))
Heap_sort(array,len(array))
print("Head_sort is :",array)
原因分析:
Broken pipe 错误,初步判断,应该是进程之间通信的管道容量不够大,数据溢出。这里有1亿个整型数据,整个大小为400MB。
解决方案:
最直接的法子,写入文件或者日志。