Ошибка памяти: происходит в Linux, но не в Mac OS - PullRequest
0 голосов
/ 10 ноября 2018

У меня есть большой массив данных панд (7 ГиБ), который я читаю из CSV. Мне нужно объединить этот фрейм данных с другим, гораздо меньшим. Допустим, его размер незначителен.

Я знаю, что операция слияния в pandas сохранит 2 кадра данных для слияния + объединенный кадр данных. Поскольку у меня всего 16 ГБ ОЗУ, при запуске слияния в Linux происходит сбой с ошибкой памяти (моя система потребляет около 3-4 ГБ).

Я также попытался запустить слияние на Mac, также с 16 ГиБ. Система потребляет около 3 ГБ ОЗУ по умолчанию. Слияние завершено на Mac с объемом памяти не более 10 ГиБ.

Как это возможно? Версия панд такая же, датафрейм такой же. Что здесь происходит?

Edit:

Вот код, который я использую для чтения / объединения моих файлов:

# Read the data for the stations, stored in a separate file
stations = pd.read_csv("stations_with_id.csv", index_col=0)
stations.set_index("id_station")

list_data = list()
data = pd.DataFrame()

# Merge all pollutants data in one dataframe
# Probably not the most optimized approach ever...
for pollutant in POLLUTANTS:
    path_merged_data_per_pollutant = os.path.join("raw_data", f"{pollutant}_merged")

    print(f"Pollutant: {pollutant}")

    for f in os.listdir(path_merged_data_per_pollutant):

        if ".csv" not in f:
            print(f"passing {f}")
            continue

        print(f"loading {f}")

        df = pd.read_csv(
            os.path.join(path_merged_data_per_pollutant, f),
            sep=";",
            na_values="mq",
            dtype={"concentration": "float64"},
        )

        # Drop useless colums and translate useful ones to english
        # Do that here to limit memory usage
        df = df.rename(index=str, columns=col_to_rename)
        df = df[list(col_to_rename.values())]

        # Date formatted as YYYY-MM
        df["date"] = df["date"].str[:7]

        df.set_index("id_station")
        df = pd.merge(df, stations, left_on="id_station", right_on="id_station")

        # Filter entries to France only (only the metropolitan area) based on GPS coordinates
        df = df[(df.longitude > -5) & (df.longitude < 12)]

        list_data.append(df)

    print("\n")

data = pd.concat(list_data)

Единственный столбец, который не является строкой, это concentration, и я указываю тип при чтении CSV. Кадр данных станции составляет <1 МБ. </p>

1 Ответ

0 голосов
/ 10 ноября 2018

MacOS сжимает память начиная с Маверикс. Если ваш фрейм данных не является буквально случайным, он не займет все 7 ГБ в ОЗУ.

Есть также способы получить сжатую память в Linux, но это не обязательно включено. Это зависит от вашего дистрибутива и конфигурации.

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