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

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

04.04.2023, 11:59. Показов 2760. Ответов 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
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru