【问题标题】:Memory Error: happening on Linux but not Mac OS内存错误:发生在 Linux 而不是 Mac OS
【发布时间】:2018-11-10 18:00:06
【问题描述】:

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

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

我还尝试在具有 16 GiB 的 Mac 上运行合并。系统默认消耗大约 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时指定了类型。 站点数据帧

【问题讨论】:

  • 你能贴出你用来读取文件的代码吗?您是否将列数据类型推断留给熊猫?如果是这样,请尝试在读取期间为数据列提供数据类型以减轻一些内存。
  • 如果您的数据框太大,Pandas 无法处理,我建议您查看Dask
  • 我提供了读取数据的代码。

标签: python pandas memory merge


【解决方案1】:

MacOS 从 Mavericks 开始压缩内存。如果您的数据帧不是真正随机的,则它不会占用 RAM 中的全部 7GiB。

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

【讨论】:

  • 哦,好的。我使用 Archlinux,而且我之前绝对没有听说过。我会调查的。
  • @Rififi,因为你在 Arch 上,也许是start here
  • 谢谢,它成功了。我首先将虚拟/压缩内存增加到 16 GiB,但它不起作用。 40 个。
猜你喜欢
  • 2015-12-19
  • 1970-01-01
  • 2012-04-18
  • 1970-01-01
  • 1970-01-01
  • 2018-06-04
  • 1970-01-01
  • 1970-01-01
  • 2022-11-21
相关资源
最近更新 更多