gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 18:40:06 24 4
gpt4 key购买 nike

我的第一篇文章:

在开始之前,我应该注意我对 OOP 比较陌生,虽然我在 SAS、R 等方面做过 DB/stat 工作,所以我的问题可能没有很好地提出:如果我需要澄清,请告诉我任何东西。

我的问题:

我正在尝试导入和解析大型 CSV 文件(~6MM 行和更大的行)。我反复遇到的两个限制是运行时和内存(Python 的 32 位实现)。下面是我的新手(第 n 次)尝试在合理时间内导入和解析的简化版本。 我怎样才能加快这个过程?由于内存限制,我在导入和执行临时摘要时拆分文件,并使用 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()

函数调用:

def ParsedSummary(longString,delimtr,rowNum):
keepColumns = [0,3,2,5,10,9,11,12,13,14,15,16,17,18]

#Do some other stuff that takes very little time

return [pse.ParseAllElements(longString.split(delimtr)[i],i) for i in keepColumns]

def CSVToList(fileName, delimtr=','):
with open(fileName) as f:
enumFile = enumerate(f)
listEnumFile = set(enumFile)
for lineCount, l in enumFile:
pass

maxSplit = math.floor(lineCount / 10) + 1

counter = 0
Summary = pd.DataFrame({}, columns = ['x1','x2','x3','x4','x5',
'x6','x7','x8','x9','x10',
'x11','x12','x13','x14'])
for counter in range(0,10):
startRow = int(counter * maxSplit)
endRow = int((counter + 1) * maxSplit)
includedRows = set(range(startRow,endRow))

listOfRows = [ParsedSummary(row,delimtr,rownum)
for rownum, row in listEnumFile if rownum in includedRows]
Summary = pd.concat([Summary,pse.MakeAndSumList(listOfRows)])

listOfRows = []
counter += 1
return Summary

(同样,这是我的第一个问题 - 所以如果我简化得太多,或者更可能是太少,我深表歉意,但我不知道如何加快这个问题。)

对于运行时比较:

使用 Access,我可以在不到 5 分钟的时间内导入、解析、汇总和合并此大小范围内的多个文件(尽管我刚好达到 2GB 的上限)。我希望我能在 Python 中获得类似的结果——目前我估计一个文件的运行时间约为 30 分钟。注意:我在 Access 的悲惨环境中拼凑了一些东西,只是因为我没有随时可用的管理员权限来安装其他任何东西。

编辑:更新了解析代码。通过将一些条件逻辑更改为 try/except,能够缩短五分钟(估计运行时间为 25 米)。此外 - 运行时估计不包括 pandas 部分 - 我忘记了我在测试时评论过这一点,但它的影响似乎可以忽略不计。

最佳答案

如果您想优化性能,请不要在 Python 中使用自己的 CSV 阅读器。已经有一个标准csv模块。也许 pandasnumpy 有更快的 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.

关于Python - 减少大型 CSV 文件的导入和解析时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27327879/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com