我需要同时阅读两种不同类型的文件,以同步它们的数据。这些文件是并行生成的,频率不同。
文件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, line_vector, False); # exit if end of file is reached
我需要同步数据块(具有相同同步信号值的行)并将新行写入另一个文件。我正在使用Spyder。
为了测试,我使用了较小的文件,FILE 1为350 MB,FILE 2为35 MB。我还使用了内置的Profiler来查看最耗时的地方,似乎有46秒中的28秒实际上是在从文件中读取数据。其余时间用于同步数据和写入新文件。
如果我将时间放大到几个G的文件大小,处理过程将需要数小时才能完成。我将尝试改变处理方式使其更快,但是否有更快的读取大文件的方法?
一行数据的格式如下:
01/31/19 08:20:55.886;0.049107050;-0.158385641;9.457415342;-0.025256720;-0.017626805;-0.000096349;0.107;-0.112;0
这些数值是传感器测量结果,最后一个数字是同步值。
low_memory=True
。它将把读取分成多个块,以降低内存消耗,但很可能会使运行速度变慢。因此,只有在遇到内存错误时才使用low_memory=True
。接下来我会在我的回答中添加一个简短的示例。 - JE_Muc