我尝试使用多列表来保存从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操作呢?
发布于 2018-06-04 06:09:13
正如hpaulj已经指出的,numpy
数组在这里没有帮助,因为你没有一致的数据大小。
正如Spinor8建议的那样,转储中间的数据:
AllList = []
limit = 10000
counter = 0
while not finished:
if counter >= limit:
print AllList
AllList = []
item = CreateYourList(...)
AllList.append(item)
counter += 1
编辑:由于您的问题专门询问有关numpy的问题,而且您甚至打开了一个赏金: numpy在这里不会对您有帮助,原因如下:
numpy.array.append()
实际上不会追加任何东西,但会创建一个新数组,这对于大型数组来说是一个巨大的开销。如果所有项都有相同数量的元素,则所以,我想,你解决这个问题的唯一方法是把你的流分解成你的内存可以处理的块,然后再把它缝在一起。也许可以把它写到一个(临时)文件中,然后附加到它上面?
发布于 2018-06-01 02:46:03
看起来您正在尝试从一个包含数字和列表的列表中创建一个数组。类似于:
In [6]: np.array([1, [1,2],[3,4]])
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-6-812a9ccb6ca0> in <module>()
----> 1 np.array([1, [1,2],[3,4]])
ValueError: setting an array element with a sequence.
如果列表的所有元素都有效
In [7]: np.array([[1], [1,2],[3,4,5]])
Out[7]: array([list([1]), list([1, 2]), list([3, 4, 5])], dtype=object)
但如果它们的长度不同,则结果是对象数组,而不是二维数值数组。这样的对象数据类型数组非常类似于列表列表,包含指向内存中其他地方的列表的指针。
多维数字数组可以使用比列表列表更少的内存,但是如果您需要首先创建列表,那么它不会有任何帮助。而且,如果子列表的大小不同,也没有任何帮助。
哦还有离np.append
远点。这是邪恶的而且你误用了它!
https://stackoverflow.com/questions/50630280
复制相似问题