【发布时间】:2018-11-10 19:40:36
【问题描述】:
我尝试使用多列表来保存从 html 中抓取的数据
但在添加 50.000 个列表后出现内存错误
所以我决定将列表更改为 numpy 数组
SapList= []
ListAll = np.array([])
def eachshop(): #filling each list for each shop data
global ListAll
SapList.append(RowNum)
SapList.extend([sap]) # here can be from one to 10 values in one list["sap1","sap2","sap3",...,"sap10"]
SapList.extend([[strLink,ProdName],ProdCode,ProdH,NewPrice, OldPrice,[FileName+'#Komp!A1',KompPrice],[FileName+'#Sav!A1','Sav']])
SapList.extend([ss]) # here can be from null to 80 sublist with 3 values [["id1", "link", "address"],["id80", "link", "address"]]
ListAll = np.append(np.array(SapList))
然后我做print(ListAll) 我得到了异常C:\Python36\scrap.py, LINE 307 "ListAll = np.append(np.array(SapList))"): setting an array element with a sequence
现在使用 pool.map 加快我的速度
def makePool(cP, func, iters):
try:
pool = ThreadPool(cP)
#perebiraem Url
pool.map_async(func,enumerate(iters, start=2)).get(99999)
pool.close()
pool.join()
except:
print('Pool Error')
raise
finally:
pool.terminate()
那么如何在我的示例中使用 numpy 数组并使用 Numpy 减少内存使用和加速 I\O 操作?
【问题讨论】:
-
如果你想要一个可以追加行的数组,你需要一个二维数组,而不是一维数组。
-
另外,
ListAll = np.append(np.array(SapList))应该做什么?它显然不会在ListAll上附加任何内容,它只会在从SapList创建的临时数组上调用append,然后将结果存储在ListAll中,替换过去的任何内容。我很确定这不是你想要的,但我不确定你确实想要什么,所以我无法告诉你如何解决它。 -
我认为
ListAll = np.append(np.array(SapList))与ListAll.append([SapList])相同 -
不,它们甚至完全不一样。后者在
ListAll上调用append方法。前者在np模块上调用append函数,甚至不将ListAll传递给它,然后将结果分配给ListAll。 -
考虑每 10k 转储一次结果,而不是等待它在 50k 条目时耗尽内存。