我有一套超过.txt
格式的记录超过一百万条。每个file.txt
只有一行:
“用户名”,“用户昵称”,24、45
我需要对百万个文件中数字特征的聚合列表进行分布检查。因此,我需要将这些文件聚合为大数据帧。我一直遵循的方法如下:
import glob
import os
import pandas as pd
import sqlite3
connex = sqlite3.connect("data/processed/aggregated-records.db")
files_lst = glob.glob("data/raw/*.txt")
files_read_count = 1
for file_name in files_lst:
data_df = pd.read_csv(file_name,
header=None,
names=['user_name', 'user_nickname',
'numeric_1', 'numeric_2'])
data_df['date_time'] = os.path.basename(file_name).strip(".txt")
data_df.to_sql(name=file_name, con=connex, if_exists="append", index=False)
files_read_count += 1
if (files_read_count % 10000) == 0:
print(files_read_count, " files read")
我的问题是,使用这种方法,我能够以非常慢的速度(每小时大约10,000个文件)写入数据库。有什么办法可以更快地运行吗?
答案 0 :(得分:2)
以下代码将处理时间缩短为每分钟10,000个文件。这是@DYZ here的建议的实现。
import csv, glob
with open('data/processed/aggregated-data.csv', 'w') as aggregated_csv_file:
writer = csv.writer(aggregated_csv_file, delimiter=',')
files_lst = glob.glob("data/raw/*.txt")
files_merged_count = 1
for file in files_lst:
with open(file) as input_file:
csv_reader = csv.reader(input_file, delimiter=',')
for row in csv_reader:
writer.writerow(row)
if (files_merged_count % 10000) == 0:
print(files_merged_count, "files merged")
files_merged_count += 1
答案 1 :(得分:1)
如果您使用的是Unix,则可以先尝试使用Shell脚本将文件串联起来,然后再读取最终的结果文件。
例如find -name '*.txt' -type f -exec cat {} \; > combinedfile.txt
现在您可以使用熊猫或其他任何方式将其移动到数据库中。