Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将大型csv文件解析为tinydb需要花费很长时间_Python_Performance_Csv_Tinydb - Fatal编程技术网

Python 将大型csv文件解析为tinydb需要花费很长时间

Python 将大型csv文件解析为tinydb需要花费很长时间,python,performance,csv,tinydb,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:

我有一个包含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是面向文档的。除此之外,从文档:

如果您需要高级功能或高性能,TinyDB不适合您

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


tinyDB完全无法管理如此数量的信息

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

  • 熊猫到DB
  • Pandas可以批量读取csv数据,速度比从文件中逐行读取快

  • 在块中而不是逐行读取csv文件,然后为该文件创建insert语句,而不是为每行创建insert语句

  • 本周我遇到了一个类似的问题,其解决方案是使用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支持的文档存储库感兴趣:


    您可以在某些字段上创建索引,并将所有内容转换为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('}}')
    
         
    

    这可能应该转移到-也许你应该检查一下
    insert\u multiple()
    我遇到了同样的问题,即插入300次后,插入速度变得非常慢(比如1秒)。安装ujson并使用
    insert\u multiple
    加快了我的插入速度。没有精确测量,但从50秒到1秒或2秒……因此使用
    insert\u multiple
    是这里的关键!