内存错误:发生在Linux上,而不是Mac OS

时间:2018-11-10 18:00:07

标签: python pandas memory merge

我有一个从csv读取的大熊猫数据框(7 GiB)。我需要将此数据框与另一个小得多的数据合并。假设它的大小可以忽略不计。

我知道pandas中的合并操作将保留2个数据帧合并+合并的数据帧。由于我只有16 GiB的RAM,因此在Linux上运行合并时,合并失败并出现内存错误(我的系统消耗大约3-4 GiB的内存)。

我也尝试在Mac上也运行16 GiB的合并。默认情况下,系统消耗约3 GiB的RAM。合并在Mac上完成,内存不超过10 GiB。

这怎么可能?大熊猫的版本是相同的,数据框是相同的。这是怎么回事?

编辑:

这是我用来读取/合并文件的代码:

# 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 MiB。

1 个答案:

答案 0 :(得分:1)

MacOS从小牛开始就压缩内存。如果您的数据帧实际上不是随机的,则不会占用RAM中的全部7GiB。

也有在Linux上获取压缩内存的方法,但这不一定启用。这取决于您的发行版和配置。