Rom*_*man 5 python csv sqlite ram pandas
我有一个存档的CSV文件形式的巨大的表(约60 GB).我想将其转换为SQLite文件.
我现在做的如下:
import pandas
import sqlite3
cnx = sqlite3.connect('db.sqlite')
df = pandas.read_csv('db.gz', compression='gzip')
df.to_sql('table_name', cnx)
Run Code Online (Sandbox Code Playgroud)
它适用于较小的文件,但有巨大的文件,我有内存问题.问题是pandas将整个表读入内存(RAM),然后将其保存到SQLite文件中.
这个问题有优雅的解决方案吗?
小智 6
我没有使用那种大小的CSV做任何工作,但这听起来像是Odo可能快速解决的问题.
我粗略地检查了文档,看起来他们已经写了一些内容,解决了大于内存的CSV解析到SQL数据库的问题,这些SQL数据库专门将SQLite3称为目标.
以下是他们发布用于解析33 GB文本文件的示例.
In [1]: dshape = discover(resource('all.csv'))
In [2]: %time t = odo('all.no.header.csv', 'sqlite:///db.db::nyc',
   ...:               dshape=dshape)
CPU times: user 3.09 s, sys: 819 ms, total: 3.91 s
Wall time: 57min 31s
Run Code Online (Sandbox Code Playgroud)
        pandas由于它的大小,这将是有问题的。任何原因都不能使用该csv模块而只能遍历文件。
基本思想(未经测试):
import gzip
import csv
import sqlite3
with gzip.open('db.gz') as f, sqlite3.connect('db.sqlite') as cnx:
    reader = csv.reader(f)
    c = cnx.cursor()
    c.executemany('insert into table_name values (?,?,...)', reader)
Run Code Online (Sandbox Code Playgroud)
        |   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           6678 次  |  
        
|   最近记录:  |