我有很多日志文件,结构如下:
logs
|
-- machine1
| |
| -- day1
| | |
| | -- machine1_timestamp11.log
| | -- machine1_timestamp12.log
| |
| -- day2
| | |
| | -- machine1_timestamp21.log
|
-- machine2
| |
| -- day1
| | |
. . .
日志文件会跟踪计算机的状态,并且可能存在两个连续日志文件中感兴趣的信息。
我的最终目标是合并给定日期的所有日志文件,然后再将它们拆分为s.t.我只有时间连续数据的日志文件,其中感兴趣的是机器的状态。每个日志文件都根据日志记录的开始时间命名,并且CSV中有timeOffset
列。因此,我希望将timeOffset + timestamp
添加到新列,并使用此列来跟踪哪个条目在合并文件中的位置。
鉴于CSV,我已经找到了如何将其拆分为"有趣的部分",但由于数据量很大(通常约为5GiB /天),我无法合并到工作
据我所知,有四种选择:
下面的代码可以解决这个问题(我认为),但是在大多数情况下运行它时我的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)
替代"购买更多内存"是不可能的,但我想对如何继续替代方案提出一些意见。