Уменьшить потребление памяти объектами внутри списков python - PullRequest
0 голосов
/ 23 февраля 2020

В настоящее время я использую Docker -compose и numpy для заполнения базы данных PostGIS в Django.

В настоящее время проблема заключается в том, что я не уверен, что потребляет так много памяти здесь:

tile_density = int(map_height * map_width / settings.NUM_OF_USERS)

    root2 = sqrt(2)
    map_radius = map_width / (2 * root2)
    lat_range = 90 / map_width  # 180 / map_width / 2
    lon_range = 90 / map_height  # 180 / map_height / 2

    print("Beginning migration creation")

    # Begin migration based on shade
    for i, y in enumerate(data):
        # y starts from top then goes to bottom

        # We have to imagine the current numpy array is like the coordinate system
        # Then translate it when creating user locations
        temp_users = []
        for x in y:
            # x is now a tile. x starts from left and moves to right
            # Points go up to 14 decimal places
            if x in (-200.0, 0.0):  # No data or no people
                continue

            # Calculate the 4 Points as boundaries for these users' coordinates.
            theta = np.arcsin(i / map_radius / root2)

            temp = np.arcsin((2 * theta + np.sin(2 * theta)) / pi)
            lat_range = (
                temp - lat_range,
                temp + lat_range
            )

            temp = pi * x / 2 / map_radius / root2 * np.cos(theta)
            lon_range = (
                temp - lon_range,
                temp + lon_range
            )

            # Add user
            for user in range(int(tile_density * x)):  # Number of users in tile
                temp_users.append(
                    User(
                        username=uuid4(),
                        password=make_password("test", None, "md5"),
                        first_name=get_first_name(),
                        last_name=get_last_name(),
                        location=Point(
                            uniform(lon_range[0], lon_range[1]),
                            uniform(lat_range[0], lat_range[1])
                        )
                    )
                )

            # Bulk add users to User model
            User.objects.bulk_create(temp_users)
            temp_users.clear()

Переменная data представляет собой массив numpy с dtype Float32. Поскольку итерация продолжается (начиная с 10 ГБ использования памяти), память быстро увеличивается с 10 ГБ до 12 ГБ и вынуждает docker выйти с кодом 137.

Я не могу сказать, что на самом деле увеличивает объем использование памяти здесь. Полный код здесь . Внизу вы увидите User (username et c.); Пользователь - это объект, который я добавил в список temp_users, который Django будет массово создавать в базе данных PostGIS. Возможно, там происходят утечки памяти, но я напечатал sys.getsizeof(temp_users), и я никогда не получаю дополнительную память, так как она перерабатывается в течение l oop.

Так что же на самом деле вызывает перегрузку памяти здесь? Форма массива Float32 numpy приблизительно равна 36000, 72143 (не помню).

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