Python 3.x 为什么python使用磁盘空间

Python 3.x 为什么python使用磁盘空间,python-3.x,pandas,temporary-files,Python 3.x,Pandas,Temporary Files,我有一台带有两个磁盘的电脑: 110GB固态硬盘 1TB硬盘驱动器 SSD中大约有18GB的可用空间 当我运行下面的python代码时,它“使用”了SSD中的所有空间(我最后只有1GB可用空间)。此代码迭代文件夹中的所有SAS文件,执行分组操作,并将每个文件的结果附加到一个大数据帧 import pandas as pd import os import datetime import numpy as np #The function GetDailyPricePoints does t

我有一台带有两个磁盘的电脑:

  • 110GB固态硬盘
  • 1TB硬盘驱动器
SSD中大约有18GB的可用空间

当我运行下面的python代码时,它“使用”了SSD中的所有空间(我最后只有1GB可用空间)。此代码迭代文件夹中的所有SAS文件,执行分组操作,并将每个文件的结果附加到一个大数据帧

import pandas as pd
import os
import datetime
import numpy as np

#The function GetDailyPricePoints does the following:
#1. Imports file
#2. Creates "price" variable
#3. Performs a group by
#4. Decode byte variables and convert salesdate to date type (if needed)

def GetDailyPricePoints(inpath,infile):
    intable = pd.read_sas(filepath_or_buffer=os.path.join(inpath,infile))

    #Create price column
    intable.loc[intable['quantity']!=0,'price'] = intable['salesvalue']/intable['quantity']
    intable['price'] = round(intable['price'].fillna(0.0),0)

    #Create outtable
    outtable = intable.groupby(["salesdate", "storecode", "price", "barcode"]).agg({'key_row':'count', 'salesvalue':'sum', 'quantity':'sum'}).reset_index().rename(columns = {'key_row':'Baskets', 'salesvalue':'Sales', 'quantity':'Quantity'})

    #Fix byte values and salesdate column
    for column in outtable:
        if not column in list(outtable.select_dtypes(include=[np.number]).columns.values): #loop non-numeric columns
            outtable[column] = outtable[column].where(outtable[column].apply(type) != bytes, outtable[column].str.decode('utf-8'))
        elif column=='salesdate': #numeric column and name is salesdate
            outtable[column] = pd.to_timedelta(outtable[column], unit='D') + pd.Timestamp('1960-1-1')

    return outtable


inpath =  r'C:\Users\admin\Desktop\Transactions'
outpath = os.getcwd() + '\Export'
outfile =  'DailyPricePoints'

dirs = os.listdir(inpath)
outtable = pd.DataFrame()

#loop through SAS files in folder
for file in dirs:
    if file[-9:] == '.sas7bdat':
        outtable.append(GetDailyPricePoints(inpath,file,decimals))

我想了解到底是什么在使用磁盘空间。此外,我想将保存此“临时工作”的路径更改为硬盘中的路径。

您正在将所有数据复制到RAM中;在这种情况下,您没有足够的内存,因此Python使用页面文件或虚拟内存。解决此问题的唯一方法是获得更多内存,或者您不能将所有内容都存储在一个大数据帧中,例如,使用
outtable.to_pickle('csvfile.csv')
将每个文件写入pickle

但是,如果坚持将所有内容存储在一个大型csv中,则可以通过将文件对象作为第一个参数传递来附加到csv:

out = open('out.csv', 'a')
outtable.to_csv(out, index = False)
在循环中执行
.to_csv()
步骤


此外,dataframes的
.append()
方法不会就地修改dataframe,而是返回一个新的dataframe(与使用列表的方法不同)。因此,您的最后一块代码可能没有达到预期效果。

您正在将所有数据复制到RAM中;在这种情况下,您没有足够的内存,因此Python使用页面文件或虚拟内存。解决此问题的唯一方法是获得更多内存,或者您不能将所有内容都存储在一个大数据帧中,例如,使用
outtable.to_pickle('csvfile.csv')
将每个文件写入pickle

但是,如果坚持将所有内容存储在一个大型csv中,则可以通过将文件对象作为第一个参数传递来附加到csv:

out = open('out.csv', 'a')
outtable.to_csv(out, index = False)
在循环中执行
.to_csv()
步骤


此外,dataframes的
.append()
方法不会就地修改dataframe,而是返回一个新的dataframe(与使用列表的方法不同)。因此,您的最后一块代码可能没有达到预期效果。

可能是分页?可能是分页?正如您正确假设的那样,我将所有内容存储在一个大的CSV中,因此我使用了open('out.CSV','a')。。方法。我在想。。是否至少有办法更改保存页面文件的硬盘(并使用我的其他驱动器)?有。这是一个切线,步骤取决于操作系统,但可以通过谷歌搜索找到。需要注意的是,人们通常将页面文件放在不包含操作系统的物理驱动器上,但在这种情况下,您的操作系统驱动器是SSD(而另一个不是),所以你需要做一些研究来权衡利弊。我想让你知道,最终真正帮助我的是在函数中导入sas_文件并在那里创建outtable。在我上面给出的代码中,已经是这样了,但是我的实际代码有点不同。。。基本上,我不会在全局范围内创建pandas dataframe变量(希望我使用的是正确的术语),因为您正确地假设我将所有内容存储在一个大的CSV中,所以我使用了open('out.CSV','a')。。方法。我在想。。是否至少有办法更改保存页面文件的硬盘(并使用我的其他驱动器)?有。这是一个切线,步骤取决于操作系统,但可以通过谷歌搜索找到。需要注意的是,人们通常将页面文件放在不包含操作系统的物理驱动器上,但在这种情况下,您的操作系统驱动器是SSD(而另一个不是),所以你需要做一些研究来权衡利弊。我想让你知道,最终真正帮助我的是在函数中导入sas_文件并在那里创建outtable。在我上面给出的代码中,已经是这样了,但是我的实际代码有点不同。。。基本上,我不会在全局范围内创建数据帧变量(希望我使用的是正确的术语)