В настоящее время я использую 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 (не помню).