将大型csv文件解析为tinydb需要永远

时间:2016-12-23 13:52:11

标签: python performance csv tinydb

我有一个包含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行

我找不到类似的东西,所以任何帮助都会受到赞赏

谢谢

5 个答案:

答案 0 :(得分:0)

TinyDB是最佳选择吗?您似乎需要一个跨国数据库,TinyDB是面向文档的。最重要的是,来自doc:Wy not use TinyDB

  

如果您需要高级功能或高性能,TinyDB是您错误的数据库

您的进程运行速度非常慢,因为您正在将数据累积到RAM中。作为一种解决方法,您可以将csv拆分为较小的主干,并使用它填充脚本。这样,每次迭代之间内存都可以清理。

tinyDB无法管理这么多信息。

答案 1 :(得分:0)

我从未使用过tinyDB,但您可以尝试以下2个选项

  1. Pandas to DB
  2. http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.to_sql.html

    Pandas可以批量读取csv数据,比从文件

    逐行读取更快
    1. 在chunk中而不是逐行读取csv文件,然后为其创建insert语句,而不是为每行创建insert语句。

答案 2 :(得分:0)

这周我遇到了类似的问题,其解决方案是使用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

答案 3 :(得分:0)

TinyDB将变慢,因为它将所有内容都加载到RAM中。我不确定有什么好的选择,尽管您可能对我前一段时间写的这个SQLite支持的文档存储库感兴趣:

https://github.com/skorokithakis/goatfish

您可以在某些字段上创建索引,并将所有内容转换为SQL查询,因此性能相当不错。

答案 4 :(得分:0)

如果要解析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('}}')