将大型 csv 文件解析为 tinydb 需要很长时间
Parsing large csv file to tinydb takes forever
我有一个包含 15 列和大约 100 万行的大型 csv 文件。我想将数据解析到 tinyDB 中。我使用的代码如下:
import csv
from tinydb import TinyDB
db = TinyDB('db.monitor')
table = db.table('Current')
i=0
datafile = open('newData.csv', 'rb')
data=csv.reader(datafile, delimiter = ';')
for row in data:
table.insert({'WT_ID': row[0], 'time': row[1], 'MeanCurrent': row[2], 'VapourPressure': row[3], 'MeanVoltage':row[4], 'Temperature': row[5], 'Humidity': row[6], 'BarPressure': row[7], 'RPM': row[8], 'WindSector': row[9], 'WindSpeed': row[10], 'AirDensity': row[12], 'VoltageDC': row[13], 'PowerSec': row[14], 'FurlingAngle': row[15]})
i=i+1
print i
然而,这真的需要很长时间。我已经设置了 i 变量来跟踪进度,虽然在第一行它运行得很快,但现在已经一个多小时了,它已经以几乎 1Hz 的速度解析了大约 10000 行
我找不到任何类似的东西,所以任何帮助将不胜感激
谢谢
TinyDB 是最好的选择吗?您似乎需要一个事务性数据库,而 TinyDB 是面向文档的。最重要的是,来自文档:Wy not use TinyDB
If you need advanced features or high performance, TinyDB is the wrong database for you
您的进程 运行 真的很慢,因为您正在将数据累积到 RAM 中。作为解决方法,您可以将 csv 拆分为较小的 t运行k 并用它填充脚本。这样,每次迭代之间的内存都可以是干净的。
tinyDB 完全无法管理如此多的信息。
我从未使用过 tinyDB,但您可以尝试以下 2 个选项
- Pandas 到数据库
http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.to_sql.html
Pandas 可以批量读取 csv 数据,并且比从文件中逐行读取更快
- 分块而不是逐行读取 csv 文件,然后为其创建插入语句而不是每行插入语句。
这周我遇到了类似的问题,其解决方案是使用 CachingMiddleware:
import csv
from tinydb import TinyDB
from tinydb.storages import JSONStorage
from tinydb.middlewares import CachingMiddleware
db = TinyDB('db.monitor', storage=CachingMiddleware(JSONStorage))
table = db.table('Current')
i=0
datafile = open('newData.csv', 'rb')
data=csv.reader(datafile, delimiter = ';')
for row in data:
table.insert({'WT_ID': row[0], 'time': row[1], 'MeanCurrent': row[2], 'VapourPressure': row[3], 'MeanVoltage':row[4], 'Temperature': row[5], 'Humidity': row[6], 'BarPressure': row[7], 'RPM': row[8], 'WindSector': row[9], 'WindSpeed': row[10], 'AirDensity': row[12], 'VoltageDC': row[13], 'PowerSec': row[14], 'FurlingAngle': row[15]})
i=i+1
print i
TinyDB 会变慢,因为它会将所有内容加载到 RAM 中。我不确定有什么好的替代方案,尽管您可能对我不久前写的 SQLite-backed 文档存储库感兴趣:
https://github.com/skorokithakis/goatfish
你可以在一些字段上创建索引,它把所有的东西都变成SQL查询,所以性能相当不错。
如果您从 csv 文件解析数据,则手动构建文件会更快。我建议如下:
import json
counter = 0
with open(csv_file) as fh, open('test.db','w') as db:
keys = None
db.write('{"_default": {')
spacer = ''
for line in fh:
if not keys:
# This is the header row
keys = line[:-1].replace(" ", "_").split('\t')
else:
counter += 1
# These are the data rows
values = line[:-1].split('\t')
db.write('{}"{}":{}'.format(spacer,counter,json.dumps(dict(zip(keys, values)))))
spacer = ','
if counter % 1000 == 0:
print( 'counter: {:10d}'.format(counter), end='\r')
db.write('}}')
用户 Pandas 写入 Json 文件,这样会快很多。
generated_rules.to_json('./Data/rules.json', orient='index', index='true')
然后编辑生成的json文件,在json文件中添加table或默认,例如
之前
{"0": {...}, "1":{...}
之后
{rules:{"0": {...}, "1":{...}}
然后将此 json 文件作为微型数据库读取。
我有一个包含 15 列和大约 100 万行的大型 csv 文件。我想将数据解析到 tinyDB 中。我使用的代码如下:
import csv
from tinydb import TinyDB
db = TinyDB('db.monitor')
table = db.table('Current')
i=0
datafile = open('newData.csv', 'rb')
data=csv.reader(datafile, delimiter = ';')
for row in data:
table.insert({'WT_ID': row[0], 'time': row[1], 'MeanCurrent': row[2], 'VapourPressure': row[3], 'MeanVoltage':row[4], 'Temperature': row[5], 'Humidity': row[6], 'BarPressure': row[7], 'RPM': row[8], 'WindSector': row[9], 'WindSpeed': row[10], 'AirDensity': row[12], 'VoltageDC': row[13], 'PowerSec': row[14], 'FurlingAngle': row[15]})
i=i+1
print i
然而,这真的需要很长时间。我已经设置了 i 变量来跟踪进度,虽然在第一行它运行得很快,但现在已经一个多小时了,它已经以几乎 1Hz 的速度解析了大约 10000 行
我找不到任何类似的东西,所以任何帮助将不胜感激
谢谢
TinyDB 是最好的选择吗?您似乎需要一个事务性数据库,而 TinyDB 是面向文档的。最重要的是,来自文档:Wy not use TinyDB
If you need advanced features or high performance, TinyDB is the wrong database for you
您的进程 运行 真的很慢,因为您正在将数据累积到 RAM 中。作为解决方法,您可以将 csv 拆分为较小的 t运行k 并用它填充脚本。这样,每次迭代之间的内存都可以是干净的。
tinyDB 完全无法管理如此多的信息。
我从未使用过 tinyDB,但您可以尝试以下 2 个选项
- Pandas 到数据库
http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.to_sql.html
Pandas 可以批量读取 csv 数据,并且比从文件中逐行读取更快
- 分块而不是逐行读取 csv 文件,然后为其创建插入语句而不是每行插入语句。
这周我遇到了类似的问题,其解决方案是使用 CachingMiddleware:
import csv
from tinydb import TinyDB
from tinydb.storages import JSONStorage
from tinydb.middlewares import CachingMiddleware
db = TinyDB('db.monitor', storage=CachingMiddleware(JSONStorage))
table = db.table('Current')
i=0
datafile = open('newData.csv', 'rb')
data=csv.reader(datafile, delimiter = ';')
for row in data:
table.insert({'WT_ID': row[0], 'time': row[1], 'MeanCurrent': row[2], 'VapourPressure': row[3], 'MeanVoltage':row[4], 'Temperature': row[5], 'Humidity': row[6], 'BarPressure': row[7], 'RPM': row[8], 'WindSector': row[9], 'WindSpeed': row[10], 'AirDensity': row[12], 'VoltageDC': row[13], 'PowerSec': row[14], 'FurlingAngle': row[15]})
i=i+1
print i
TinyDB 会变慢,因为它会将所有内容加载到 RAM 中。我不确定有什么好的替代方案,尽管您可能对我不久前写的 SQLite-backed 文档存储库感兴趣:
https://github.com/skorokithakis/goatfish
你可以在一些字段上创建索引,它把所有的东西都变成SQL查询,所以性能相当不错。
如果您从 csv 文件解析数据,则手动构建文件会更快。我建议如下:
import json
counter = 0
with open(csv_file) as fh, open('test.db','w') as db:
keys = None
db.write('{"_default": {')
spacer = ''
for line in fh:
if not keys:
# This is the header row
keys = line[:-1].replace(" ", "_").split('\t')
else:
counter += 1
# These are the data rows
values = line[:-1].split('\t')
db.write('{}"{}":{}'.format(spacer,counter,json.dumps(dict(zip(keys, values)))))
spacer = ','
if counter % 1000 == 0:
print( 'counter: {:10d}'.format(counter), end='\r')
db.write('}}')
用户 Pandas 写入 Json 文件,这样会快很多。
generated_rules.to_json('./Data/rules.json', orient='index', index='true')
然后编辑生成的json文件,在json文件中添加table或默认,例如
之前
{"0": {...}, "1":{...}
之后
{rules:{"0": {...}, "1":{...}}
然后将此 json 文件作为微型数据库读取。