Форум программистов, компьютерный форум, киберфорум
Python: Научные вычисления
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
6 / 6 / 1
Регистрация: 26.09.2017
Сообщений: 68

np.array большое потребление памяти

04.04.2023, 11:59. Показов 2687. Ответов 25

Студворк — интернет-сервис помощи студентам
кусок данных беру из бд напрямую в panda.dataframe делаю пред обработку и маленькими частями запихиваю в list
Python
1
2
3
sql = pd.read_sql(f'SELECT...', con=engine)
a = []
a.append(sql[i:i+window])
Получается матрица 4974910, 256, 91 в этот момент процесс python потребляет в районе 5 гб памяти
Для tensorflow нужно чтобы данные были в numpy Я и запихиваю всё это в
Python
1
np.array(a, dtype=np.float32)
он просто скажет что у вас не хватает памяти
10% выжирает около 40 гигов

все данные входят в диапазон от 0 до 1

Есть ли способ уменьшить массив? float16 ситуацию не меняет.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.04.2023, 11:59
Ответы с готовыми решениями:

Как уменьшить потребление памяти?
b = u = z = for i in u: if u.count(i) < 2: del b for i in b: h = for j in b: if sorted(i)...

Увеличиваем скорость Python и уменьшаем потребление памяти
Если не учитывать, разные советы по увеличению скорости, например замена for на while, то предлагаю знающих людей высказаться, какая из...

Большое потребление памяти приложением
Здравствуйте! Как всегда нужна ваша помощь... Почему происходит ошибка компиляции при увеличении числа N в строке "#define...

25
Модератор
Эксперт Python
 Аватар для Fudthhh
2695 / 1601 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
04.04.2023, 12:20
Цитата Сообщение от Snowman8526 Посмотреть сообщение
sql = pd.read_sql(f'SELECT...', con=engine)
Загрузили датафрейм, допустим заняли 5гб.

Цитата Сообщение от Snowman8526 Посмотреть сообщение
a = []
a.append(sql[i:i+window])
Разбили этот датафрейм, на части, и запихнули в массив, заняли еще 5 гб.

Цитата Сообщение от Snowman8526 Посмотреть сообщение
np.array(a, dtype=np.float32)
Создали еще один массив, заняли еще 5гб.

Ты понимаешь что вообще делаешь в программе? На этапе подготовки, ты уже занял 15гб места в пустую.

Добавлено через 3 минуты
Тут либо данные подтягивать ленивым способом, либо не создавать кучу не нужных переменных и держать кулачки чтоб тебе хватило места.
0
6 / 6 / 1
Регистрация: 26.09.2017
Сообщений: 68
04.04.2023, 13:09  [ТС]
Fudthhh, Не совсем так pandas Я использую только для предобработки данных. В цикле он обновляется больше 2000 раз и можно просто пренебречь. np после записи массива занимает больше 40 гигов. это без учёта предыдущих данных. Я просто не понимаю почему np.array занимает в 3.5 раза больше памяти. если бы в 2-а раза вопросов бы не возникло.

Добавлено через 4 минуты
Fudthhh, Вполне возможно что надо сохранять не в list а в pandas.datafreme и после этого преобразовывать. Может np создаёт индексы вдоль и поперёк и можно их как то отключить Я не нашёл не чего в интернете.
0
Модератор
Эксперт Python
 Аватар для Fudthhh
2695 / 1601 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
04.04.2023, 13:35
Цитата Сообщение от Snowman8526 Посмотреть сообщение
Не совсем так pandas Я использую только для предобработки данных. В цикле он обновляется больше 2000 раз и можно просто пренебречь.
В приведенном коде, он не обновляется, а жестко висит в памяти пока программа работает.

Цитата Сообщение от Snowman8526 Посмотреть сообщение
np после записи массива занимает больше 40 гигов
Ты написал, что получаешь трех мерный массив, размером: 4974910, 256, 91. И возьмем float16 - 2 байта.
А теперь посчитай: 4974910 * 256 * 91 * 2 = ?
0
578 / 411 / 69
Регистрация: 09.01.2018
Сообщений: 1,363
04.04.2023, 13:36
Вообще-то копирование DataFrame в массив numpy лучше делать вот так:

Python
1
df_n2=df.to_numpy()
или вот так:

Python
1
df_n3=df.to_numpy(copy=True)
в зависимости от того, будете-ли вы создавать поверхностную копию или глубокую.

Даже в последнем случае оказывается, что роста объема практически нет. Легкий эксперимент:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import numpy as np
import pandas as pd
import sys
lt=np.random.normal(size=1000)
df = pd.DataFrame({"A": lt, 
                   "B": lt,
                   "С": lt,})
print('df   :  ',sys.getsizeof(df))
 
df_n2=df.to_numpy()
print('df_n2: ',sys.getsizeof(df_n2))
 
df_n3=df.to_numpy(copy=True)
print('df_n2: ',sys.getsizeof(df_n3))
Результат:
Python
1
2
3
df   :   24144
df_n2:  120
df_n2:  120
2
6 / 6 / 1
Регистрация: 26.09.2017
Сообщений: 68
04.04.2023, 13:55  [ТС]
passant, Значит надо заполнять в pandas? Я почему-то изначально решил заполнять в list Сегодня протестировать не успею ну если что отпишусь завтра.
0
578 / 411 / 69
Регистрация: 09.01.2018
Сообщений: 1,363
04.04.2023, 14:33
Что значит "надо заполнять в pandas?". Я не говорил ни про "надо", ни про pandas. Я просто показал, как надо обращаться с памятью. Ну, как минимум - из pandas перегонять прямо в numpy, а не через список. А все остальное - использование сначала Pandas, потом numpy - это ваше личное решение.
0
6 / 6 / 1
Регистрация: 26.09.2017
Сообщений: 68
04.04.2023, 14:40  [ТС]
passant,
Цитата Сообщение от passant Посмотреть сообщение
Вообще-то копирование DataFrame в массив numpy лучше делать вот так:
Этой фразой вы говорите что надо заполнять в pandas потому что только у него есть dataframe
Я без каких то претензий говорил. Извините если чем то обидел.
0
578 / 411 / 69
Регистрация: 09.01.2018
Сообщений: 1,363
04.04.2023, 15:00
Этой фразой я говорю, что если у вас есть DataFrame (почему он у вас есть - я не знаю, это вы так решили) и него скопировать в numpy (опять таки, это вы так решили), то делать это лучше не через первую перегонку в список - с потерей памяти, вторую перегонку в массив - с еще одной потерей памяти, а напрямую, при которой память дополнительно вообще практически не расходуется.
0
6 / 6 / 1
Регистрация: 26.09.2017
Сообщений: 68
04.04.2023, 15:24  [ТС]
passant, dataframe мне нужен для быстрой предобработки всего фрейма есть лямбда которая скейлит одну строку датафрейма. Питоровскими методами это занимает секунд 20 а в датафрейме секунду на все строки. np с многомерными массивами работает быстрее + reshape. Я почитаю как дозаписывать np.array но на сколько Я помню он выделяет память на оба массива копирует всё это добро и удаляет старый массив.
0
578 / 411 / 69
Регистрация: 09.01.2018
Сообщений: 1,363
04.04.2023, 16:00
Цитата Сообщение от Snowman8526 Посмотреть сообщение
Я почитаю как дозаписывать np.array но на сколько Я помню он выделяет память на оба массива копирует всё это добро и удаляет старый массив.
Конечно. Массив - что в Python, что в С++, что где угодно - это не та структура, которая "любит" добавление и удаление элементов. Это сделано ради скорости обработки массивов. И выбор между списком и массивом - всегда компромисс между скоростью обработки и расходом памяти. Это не открытие и изучается студентами где-то на втором курсе примерно. И говорит только о том, что ваш скрипт должен в своем алгоритме учитывать эту особенность.
0
04.04.2023, 16:11

Не по теме:

passant, проблема xy.

0
6 / 6 / 1
Регистрация: 26.09.2017
Сообщений: 68
04.04.2023, 16:28  [ТС]
passant, Да Я это понимаю что tuple не любит добавлений из за чего он быстрее и меньше весит чем list. Вернёмся к началу разговора Я понимаю что python list имеет большой объём из за того что туда можно записать str int float и всё это в одном списке. Как получается что создание стандартизированного float32 занимает больше места в памяти чем list питора? Может быть из за того что создаётся из листа он больше памяти занимает? Я не знаю и не где такой информации не нашёл.
0
578 / 411 / 69
Регистрация: 09.01.2018
Сообщений: 1,363
04.04.2023, 18:03
Цитата Сообщение от Fudthhh Посмотреть сообщение

Не по теме:

passant, проблема xy.

Ага. Очень похоже :-)

Добавлено через 32 минуты
Цитата Сообщение от Snowman8526 Посмотреть сообщение
Да Я это понимаю что tuple не любит добавлений из за чего он быстрее и меньше весит чем list.
Вы о чем вообще??? Где и кто выше писал о tuple ??? Хоть слово???
И по ходу. tuple - не "не любит" дополнения. Он их просто на дух не переносит, т.е. прямо и безоговорочно ЗАПРЕЩАЕТ!

Цитата Сообщение от Snowman8526 Посмотреть сообщение
Как получается что создание стандартизированного float32 занимает больше места в памяти чем list питора?
Еще раз. Вы о чем???

Python
1
2
3
4
5
6
7
lt2 = []
for i in range(100000):
   lt2.append(random.random())
print('lt2 :  ',sys.getsizeof(lt2))
 
np2=np.array(lt2)
print('np2   :  ',sys.getsizeof(np2))
Результат:
Python
1
2
lt2     :   800984
np2   :   800104
Что больше, а что меньше определить сумеете?

Что такое "стандартизированное float32" для меня вообще осталось загадкой.
0
04.04.2023, 18:22

Не по теме:

passant, мне кажется он не понимает что коллекция из 4974910 * 256 * 91 элементов, будет весить в любом случае очень много, если загонять ее прямиком в память. Скорее всего это обучающий датасет, и он не понимает как реализовать ленивое чтение чтобы тренировать свою модель.

0
6 / 6 / 1
Регистрация: 26.09.2017
Сообщений: 68
04.04.2023, 18:28  [ТС]
passant,
Цитата Сообщение от passant Посмотреть сообщение
Что больше, а что меньше определить сумеете?
https://stackoverflow.com/ques... mpy-arrays
Цитата Сообщение от passant Посмотреть сообщение
Что такое "стандартизированное float32" для меня вообще осталось загадкой.
Это обозначает что каждый элемент массива будет иметь стандартное выделение памяти для float32 это 4кб.
Вы ведёте себя как ребёнок. Если не можете ответить можете перестать писать чушь?

Добавлено через 5 минут
Fudthhh, Я всё понимаю и данные для моего датасета избыточны. Я не понимаю как они помещаются в list python и не помещаются в np для меня это загадка. И Я пришёл узнать мнение умных людей.
0
Модератор
Эксперт Python
 Аватар для Fudthhh
2695 / 1601 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
04.04.2023, 18:56
Snowman8526, сгенирируй мне массив такого размера 4974910 * 256 * 91 не используя numpy

Добавлено через 37 секунд
Цитата Сообщение от Snowman8526 Посмотреть сообщение
Это обозначает что каждый элемент массива будет иметь стандартное выделение памяти для float32 это 4кб.
Если-бы 4кб....

Добавлено через 2 минуты
Цитата Сообщение от Snowman8526 Посмотреть сообщение
Вы ведёте себя как ребёнок.
Ты пишешь как ребенок, ты не можешь сформулировать задачу, вопросы и не можешь аргументировать свои заявления кодом.

Добавлено через 11 минут
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import numpy
import tracemalloc
 
 
tracemalloc.start()
print(tracemalloc.get_traced_memory())
 
a = [[[.0 for _ in range(20)] for _ in range(20)] for _ in range(20)]
 
print(tracemalloc.get_traced_memory())
tracemalloc.stop()
 
 
tracemalloc.start()
print(tracemalloc.get_traced_memory())
 
b = numpy.zeros((20, 20, 20), numpy.float16)
 
print(tracemalloc.get_traced_memory())
tracemalloc.stop()
python 3.10 x64
Code
1
2
3
4
(0, 0)
(100152, 100680)
(0, 0)
(16168, 16168)
Добавлено через 5 минут
Если тебе не ясно, то вот держи, читай и просвещайся: https://svn.python.org/project... iew=markup
1
6 / 6 / 1
Регистрация: 26.09.2017
Сообщений: 68
04.04.2023, 23:16  [ТС]

Да немного ошибся не 5 а 13.6 гигов не 4974910 а 4974917
0
578 / 411 / 69
Регистрация: 09.01.2018
Сообщений: 1,363
05.04.2023, 10:37
Чего?????
Цитата Сообщение от Snowman8526 Посмотреть сообщение
Это обозначает что каждый элемент массива будет иметь стандартное выделение памяти для float32 это 4кб.
Вы ведёте себя как ребёнок. Если не можете ответить можете перестать писать чушь?
И после этого вы будете мне говорить, что я пишу чушь? Вы хоть понимаете, что такое 4КB ????
Про tuple, который у вас откуда-то по дороге возник я вообще молчу.


Цитата Сообщение от Snowman8526 Посмотреть сообщение
Fudthhh, Я всё понимаю и данные для моего датасета избыточны. Я не понимаю как они помещаются в list python и не помещаются в np для меня это загадка. И Я пришёл узнать мнение умных людей.
Я вам показал, что список всегда (!!!!!) занимает больше памяти, чем numpy-массив. Даже если он состоит - по вашей дивной терминологии - из "стандартизированное float32". И я и коллега Fudthhh привели примеры, которые воочию это показывают тем, кто не понимают, как и почему это происходит.

Не нравятся мои ответы и пояснения, не можете их "переварить" - продолжайте упражняться в изобретении терминов и решении проблемы XY самостоятельно. Мне стало не интересно при таком вашем подходе вести дальнейший диалог.
0
Модератор
Эксперт Python
 Аватар для Fudthhh
2695 / 1601 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
05.04.2023, 11:07
Snowman8526, покажи код инициализации X_train
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.04.2023, 11:07
Помогаю со студенческими работами здесь

Большое потребление памяти PostgreSQL
Дано: 1. pg 12.3; 2. настройки дефолтные, за приключением max_connections=500; 3. реальное количество подключений к БД 100-150; ...

Большое потребление памяти с использованием assimp opengl
Использую библиотеку assimp и заметил большое потребление памяти при загрузке небольших моделей с двумя текструрами программа потребляет 60...

Большое потребление памяти при вызове метода
Наблюдаю очень странное поведение Visual Studio 2008. В моём проекте на C# есть один метод, который содержит большое число кода (циклы,...

nginx+php-fpm debian - большое потребление памяти
Больше потребление cached памяти на сервере. (Графиг приложен). mysql, memcached вынесены на отдельный сервер. На этом сервере стоит...

Слишком большое потребление оперативной памяти в простом приложении
Привет. Это простое приложение чтобы делать скриншоты. Скажите почему оно занимает слишком много оперативной памяти? Точнее потребление...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru