Python减少大型CSV文件的导入和解析时间

2024-06-26 18:09:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我的第一篇文章:

在开始之前,我应该注意到我对OOP比较陌生,虽然我在SAS、R等方面做过DB/stat工作,所以我的问题可能不太合适:如果需要澄清什么,请告诉我。在

我的问题:

我正在尝试导入和解析大型CSV文件(可能会有大约6MM的行或更大的行)。我反复遇到的两个限制是运行时和内存(Python的32位实现)。下面是我的新手(nth)尝试在合理的时间内导入和解析的简化版本。如何加快这一过程?由于内存限制,我在导入和执行临时摘要时拆分文件,并使用pandas进行摘要:

解析和总结:

def ParseInts(inString):
    try:
        return int(inString)
    except:
        return None
def TextToYearMo(inString):
    try:
        return 100*inString[0:4]+int(inString[5:7])
    except:
        return 100*inString[0:4]+int(inString[5:6])
def ParseAllElements(elmValue,elmPos):
    if elmPos in [0,2,5]:
        return elmValue
    elif elmPos == 3:
        return TextToYearMo(elmValue)
    else:
        if elmPos == 18:
            return ParseInts(elmValue.strip('\n'))
        else:
            return ParseInts(elmValue)

def MakeAndSumList(inList):
    df = pd.DataFrame(inList, columns = ['x1','x2','x3','x4','x5',
                                         'x6','x7','x8','x9','x10',
                                         'x11','x12','x13','x14'])
    return df[['x1','x2','x3','x4','x5',
               'x6','x7','x8','x9','x10',
               'x11','x12','x13','x14']].groupby(
               ['x1','x2','x3','x4','x5']).sum().reset_index()

函数调用:

^{pr2}$

(同样,这是我的第一个问题,因此,如果我简化得太多或太少,我很抱歉,但我不知道如何加快这一过程。)

对于运行时比较:

使用Access,我可以在<;5分钟内导入、解析、汇总和合并多个大小在这个范围内的文件(尽管我正好在它的2GB lim)。我希望我可以在Python中得到类似的结果-目前我估计一个文件的运行时间大约为30分钟。注意:我把一些东西放在Access糟糕的环境中只是因为我没有现成的管理员权限来安装其他东西。在

编辑:更新了解析代码。能剃掉5分钟(东部时间。运行时间为25m),通过将一些条件逻辑改为try/except。另外-运行时估计不包括pandas部分-我忘了我在测试时已经注释掉了,但是它的影响似乎可以忽略不计。在


Tags: 文件returndef时间intx1x2try
1条回答
网友
1楼 · 发布于 2024-06-26 18:09:02

如果你想优化性能,不要用Python编写CSV阅读器。已经有一个标准的^{}模块。也许pandas或{}有更快的csv阅读器;我不确定。在

https://softwarerecs.stackexchange.com/questions/7463/fastest-python-library-to-read-a-csv-file

In short, pandas.io.parsers.read_csv beats everybody else, NumPy's loadtxt is impressively slow and NumPy's from_file and load impressively fast.

相关问题 更多 >