Python:多个文件处理非常慢

前端之家收集整理的这篇文章主要介绍了Python:多个文件处理非常慢 前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

为了同步它们的数据,我必须同时阅读2种不同类型的文件.文件以不同的频率并行生成.

文件1的大小将很大(大于10 GB),其结构如下:DATA是一个包含100个字符的字段,其后的数字是两个文件都通用的同步信号(即,它们在在两个文件中同时显示).

DATA 1
DATA 1
... another 4000 lines
DATA 1
DATA 0
... another 4000 lines and so on

较小的文件2(最多10 MB,但数量更多)具有相同的结构,不同之处在于同步信号更改之间的行数:

DATA 1
... another 300-400 lines
DATA 1
DATA 0
... and so on

这是我用来读取文件代码

def getSynchedChunk(fileHandler,lastSynch,end_of_file):

    line_vector = [];                         # initialize output array
    for line in fileHandler:                  # iterate over the file
        synch = int(line.split(';')[9]);      # get synch signal
        line_vector.append(line);         
        if synch != lastSynch:                # if a transition is detected
            lastSynch = synch;                # update the lastSynch variable for later use
            return (lastSynch,line_vector,True); # and exit - True = sycnh changed

     return (lastSynch,False); # exit if end of file is reached

我必须同步数据块(具有相同同步信号值的行),并将新行写入另一个文件.
我正在使用Spyder.

为了进行测试,我使用了较小的文件,文件1为350 MB,文件2为35 MB.
我还使用内置的探查器查看了花费最多的时间,似乎46秒中的28秒实际上是在从文件中读取数据.其余的用于同步数据和写入新文件.

如果我将时间扩大到以演出为单位的文件,将需要几个小时才能完成处理.我将尝试更改处理方式以使其更快,但是是否有更快的方式来读取大文件

一行数据如下所示:

01/31/19 08:20:55.886;0.049107050;-0.158385641;9.457415342;-0.025256720;-0.017626805;-0.000096349;0.107;-0.112;0

这些值是传感器测量值.最后一个数字是同步值.

最佳答案
我建议先读取整个文件,然后再进行处理.这具有巨大的优势,即读取时的所有附加/连接等操作都是使用优化的模块在内部完成的.可以随后进行同步.

为此,我强烈建议使用pandas,它是迄今为止处理时间序列数据(如测量值)的最佳工具.

导入文件,猜测文本文件中的csv是正确的格式,可以执行以下操作:

df = pd.read_csv(
    'DATA.txt',sep=';',header=None,index_col=0,parse_dates=True,infer_datetime_format=True,dayfirst=True)

为了减少内存消耗,您可以指定一个块大小来拆分文件读取,也可以指定low_memory = True在内部拆分文件读取过程(假设最终数据帧适合您的内存):

df = pd.read_csv(
    'DATA.txt',dayfirst=True,low_memory=True)

现在,您的数据将存储在DataFrame中,这对于时间序列而言是完美的.索引已经转换为DateTimeIndex,这将允许进行漂亮的绘图,重采样等.

现在可以像使用numpy数组一样(只需添加iloc访问方法)轻松访问sync状态:

df.iloc[:,8]  # for all sync states
df.iloc[0,8]  # for the first synch state
df.iloc[1,8]  # for the second synch state

这是使用两个或多个文件快速向量化同步的理想选择.

要根据可用内存读取文件

try:
    df = pd.read_csv(
        'DATA.txt',dayfirst=True)
except MemoryError:
    df = pd.read_csv(
        'DATA.txt',low_memory=True)

这种try / except解决方案可能不是一个很好的解决方案,因为在引发MemoryError之前需要花费一些时间,但是它是故障安全的.而且由于low_memory = True在大多数情况下很可能会降低文件读取性能,因此try块在大多数情况下应该更快.

猜你在找的Python相关文章