内存有效的方式来更改CSV文件并使用Pandas将结果合并到一个大型CSV中?

时间:2018-02-02 11:49:07

标签: python pandas csv

我有很多日志文件,结构如下:

logs | -- machine1 | | | -- day1 | | | | | -- machine1_timestamp11.log | | -- machine1_timestamp12.log | | | -- day2 | | | | | -- machine1_timestamp21.log | -- machine2 | | | -- day1 | | | . . .

日志文件会跟踪计算机的状态,并且可能存在两个连续日志文件中感兴趣的信息。

我的最终目标是合并给定日期的所有日志文件,然后再将它们拆分为s.t.我只有时间连续数据的日志文件,其中感兴趣的是机器的状态。每个日志文件都根据日志记录的开始时间命名,并且CSV中有timeOffset列。因此,我希望将timeOffset + timestamp添加到新列,并使用此列来跟踪哪个条目在合并文件中的位置。

鉴于CSV,我已经找到了如何将其拆分为"有趣的部分",但由于数据量很大(通常约为5GiB /天),我无法合并到工作

据我所知,有四种选择:

  1. 获取更多内存。
  2. 利用一些聪明的数据流,避免将所有日志文件读入内存。
  3. 预处理日志文件,以便已经进行过滤过程。虽然,我仍然认为这些结果日志文件太大了。
  4. 读取日志文件,添加必要的数据,将其作为新的CSV写入磁盘。然后 - 对于所有剩余的日志文件 - 读取另一个日志文件,添加必要的数据,将其附加到CSV。
  5. 下面的代码可以解决这个问题(我认为),但是在大多数情况下运行它时我的RAM都用完了。

    def main():
    
        # Acquire list of all log files
        files = glob.glob(root + 'logs/day1/*.log', recursive = True)
    
        # Create a dataframe for each file
        dfs = list()
        for path in files:
    
            # Extract machine ID and time stamp from filename
            file_name = path.split("/")[-1]
            machine = file_name.split("_")[0]
            unix_ms_time = datetime.fromtimestamp(int(file_name.split("_")[-1].split(".")[0])/1000.0)
            date = unix_ms_time.strftime("%Y-%m-%d")
    
            # Read data from file
            df = pd.read_csv(path, sep = ';')
    
            # Add a time column to allow for continuity between files
            df["time"] = unix_ms_time + pd.to_timedelta(df["timeOffset"], unit = "ms")
    
            # Add each dataframe to list
            dfs.append(df)
    
        # Concatenate all frames, the resulting frames contains all log data for
        # one particular day and machine
        result = pd.concat(dfs)
    
        # Write result to disk
        root_save = "merged/"
        save_path = "{}{}_{}.csv".format(root_save, machine, date)
        print("Saving to: {}".format(save_path))
        result.to_csv(save_path)
    

    替代"购买更多内存"是不可能的,但我想对如何继续替代方案提出一些意见。

0 个答案:

没有答案