пустое использование памяти при назначении новых значений - PullRequest
0 голосов
/ 30 января 2019

У меня есть класс генерации данных, который производит данные в пакетном режиме.Это упрощено, как показано ниже:

import numpy as np
import os
import psutil


def memory_check():
    pid = os.getpid()
    py_mem = psutil.Process(pid)
    memory_use = py_mem.memory_info()[0] / 2. ** 30
    return {"python_usage": memory_use}


class DataBatcher:
    def __init__(self, X, batch_size):
        self.X = X
        self.start = 0
        self.batch_size = batch_size
        self.row_dim, col_dim = X.shape
        self.batch = np.zeros((batch_size, col_dim))

    def gen_batch(self):
        end_index = self.start + self.batch_size
        if end_index < self.row_dim:
            indices = range(self.start, end_index)
            print("before assign batch \n", memory_check())
            self.batch[:] = self.X.take(indices, axis=0, mode='wrap')
            print("after assign batch \n", memory_check())
            self.start = end_index
            return self.batch


if __name__ == "__main__":
    X = np.random.sample((1000000, 50))
    for i in range(100):
        data_batcher = DataBatcher(X, 5000)
        x = data_batcher.gen_batch()

Фактический код довольно близок к приведенному выше, за исключением того, что self.X генерируется в другом методе внутри класса DataBatcher и периодически обновляется.Я заметил, что использование памяти Python постоянно увеличивается каждый раунд в строке self.batch[:] = self.X.take(indices, axis=0, mode='wrap'), когда в self.X не вносятся изменения.Я думал, что это не должно быть, так как я предварительно выделил память для self.batch?

1 Ответ

0 голосов
/ 30 января 2019

Как ответили в Почему numpy.zeros занимает мало места , это удивительное поведение может быть некоторой оптимизацией на уровне ОС: np.zeros на самом деле не занимает память, если вы эффективно пишете на нееself.batch[:] = self.X.take(indices, axis=0, mode='wrap')

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