Ошибка массива при установке элемента массива с последовательностью - PullRequest
0 голосов
/ 31 мая 2018

Я пытался использовать Multilist для хранения очищенных данных из 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?

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Как уже указывал 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 необходимо знать размер массива во время создания массива.numpy.array.append() на самом деле ничего не добавляет, но создает новый массив, который представляет собой огромные накладные расходы с большими массивами.
  • Numpy массивы работают лучше всего, если все элементы имеют одинаковое количество элементов,В частности, вы можете думать о числовом массиве как о матрице: все строки имеют одинаковое количество столбцов.
  • Вы можете создать числовой массив на основе самого большого элемента в вашем потоке данных, но это будет означать, что вы выделяетепамять, которая вам не нужна (элементы массива, которые никогда не будут заполнены).Это явно не решит вашу проблему с памятью.

Так что, ИМХО, ваш единственный способ решить эту проблему - разбить ваш поток на куски, которые ваша память может обрабатывать, и сшить их вместе потом.Может быть, записать его в (временный) файл и добавить к нему?

0 голосов
/ 31 мая 2018

Похоже, вы пытаетесь создать массив из списка, который содержит число и списки.Что-то вроде:

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)

Но если они различаются по длине, результатом является массив объектов, а не двумерный числовой массив.Такой объектный массив dtype очень похож на список списков, содержащий указатели на списки в других местах памяти.

Многомерный числовой массив может использовать меньше памяти, чем список списков, но это не поможетесли вам нужно сделать списки в первую очередь.И это совсем не поможет, если подсписки различаются по размеру.

О, и держитесь подальше от np.append.Это зло .Кроме того, вы неправильно использовали это!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...