将非常大的文件拆分为Python中的较小文件 - 打开的文件过多

时间:2018-04-27 12:32:12

标签: python bigdata

我有一个非常大的csv文件(接近Terabyte)我希望根据每行中的信息拆分成较小的csv文件。

由于在内存中无法做到这一点,我的目标是读取每一行,决定它应该进入哪个文件,然后将其附加到那里。然而这需要很长时间,因为打开和关闭时间太长。

我的第二种方法是保持所有文件(大约3000个)打开 - 但这不起作用,因为我无法并行打开这么多文件。

根据要求提供的其他详细信息:.csv文件包含我需要按地区访问的地图数据。因此,我计划将其聚类到覆盖不同边界框的文件中。由于它是未排序的数据,我必须处理每行的lat / lon,为其分配正确的文件,并将该行附加到文件中。

对此有什么用(快速,理想)方法?

2 个答案:

答案 0 :(得分:3)

这可能是一种hacky方法,但它需要并做一些批量追加。这将解决在每行处理期间必须打开和关闭文件的问题。我将假设您将行分类为CSV的方式基于大型CSV中某列的某些值。

pandas

答案 1 :(得分:1)

虽然我同意这些评论,知道文件的细节对提供实际工作答案至关重要,但我有一个类似的问题,并使用熊猫解决它。

pandas的.read_csv方法将使用csv reader仅部分读取csv文件而不将整个文件加载到内存中。最好是做一些试验和错误,看看你的系统能够支持多少行

import pandas as pd
num_rows = 6000 # or some value which depends on system memory 
NewDf1 =pd.DataFrame()
NewDf2 = pd.DataFrame()

for i in range(start,stop,num_rows):
    rawdata_df = pd.read_csv(filename,skiprows=range(1,i),nrows=num_rows) 
    NewDf1.append(rawdata_df[rawdata_df.iloc[1]>0],ignore_index=True)
    NewDf2.append(rawdata_df[rawdata_df.iloc[2]>0],ignore_index=True)

最后,取决于您的实际系统内存和文件结构(因为数据框的大小还取决于列数和数据结构),您可以将单独的数据帧保存在单独的csvs中

 if len(NewDf1) > toolarge:
      NewDf1.to_csv('newdf1Filename.csv')