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

Python 内存错误:发生在Linux上,而不是Mac OS上,python,pandas,memory,merge,Python,Pandas,Memory,Merge,我有一个从csv读取的大熊猫数据帧(7Gib)。我需要将这个数据帧与另一个更小的数据帧合并。假设它的大小可以忽略不计 我知道pandas中的合并操作将保持2个数据帧合并+合并的数据帧。由于我只有16 GiB的RAM,当我在Linux上运行合并时,它会失败,并出现内存错误(我的系统消耗大约3-4 GiB) 我还尝试在Mac电脑上运行合并,也使用16 GiB。默认情况下,系统消耗大约3 GiB的RAM。合并在Mac上完成,内存不超过10Gib 这怎么可能?熊猫的版本是相同的,数据帧是相同的。这里发生

我有一个从csv读取的大熊猫数据帧(7Gib)。我需要将这个数据帧与另一个更小的数据帧合并。假设它的大小可以忽略不计

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

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

这怎么可能?熊猫的版本是相同的,数据帧是相同的。这里发生了什么

编辑:

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

# 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)
#读取存储在单独文件中的站点数据
stations=pd.read\u csv(“stations\u带有\u id.csv”,索引\u col=0)
站点。设置索引(“id站点”)
列表\数据=列表()
data=pd.DataFrame()
#将所有污染物数据合并到一个数据帧中
#可能不是有史以来最优化的方法。。。
对于污染物中的污染物:
path\u merged\u data\u per\u policient=os.path.join(“原始数据”,f“{policient}\u merged”)
打印(f“污染物:{污染物}”)
对于os.listdir中的f(每个污染物的路径合并数据):
如果“.csv”不在f中:
打印(f“通过{f}”)
持续
打印(f“加载{f}”)
df=pd.read\u csv(
os.path.join(每个污染物的路径合并数据,f),
sep=“;”,
na_values=“mq”,
数据类型={“浓度”:“float64”},
)
#扔掉无用的柱子,把有用的翻译成英语
#在此处执行此操作以限制内存使用
df=df.rename(index=str,columns=col\u to\u rename)
df=df[list(col_to_rename.values())]
#格式为YYYY-MM的日期
df[“日期”]=df[“日期”].str[:7]
df.设置索引(“id\U站”)
df=pd.merge(df,station,left_on=“id_station”,right_on=“id_station”)
#根据GPS坐标过滤仅法国(仅大都市区)的条目
df=df[(df.经度>-5)和(df.经度<12)]
列表_数据追加(df)
打印(“\n”)
数据=局部放电浓度(列表数据)
唯一不是字符串的列是
concentration
,我在读取csv时指定了类型。
站点数据帧是<1 MiB。

MacOS压缩内存,因为Mavericks。如果您的数据帧不是随机的,它将不会占用RAM中的全部7GiB


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

您可以发布用于读取文件的代码吗?是否将列数据类型推断留给pandas?如果是这样,请尝试在读取期间为数据列提供数据类型以减少内存。如果您的数据帧太大,熊猫无法处理,我建议您查看。我提供了读取数据的代码。哦,好的。我用的是Archlinux,我以前肯定没听说过。我会调查的。@Rififi,既然你在拱门上,也许吧。谢谢你,成功了。我首先将虚拟/压缩内存增加到16 GiB,但它不起作用。40岁。