web-dev-qa-db-ja.com

データベースへの書き込み時にPython 3のSQLite3でのディスクI / Oエラー

私はpythonを始めたばかりの学生で、リレーショナルデータベース管理システムの作成を任されていました。かなり遠くまで来たようですが、壁にぶつかったようです。これは私のコードです:

import csv
import sqlite3

conn = sqlite3.connect('unfccc.db')
c = conn.cursor()

c.execute('''CREATE TABLE unfccc (
        Country TEXT, 
        CodeCountryFormat TEXT, 
        NamePollutant TEXT, 
        NameYearSector TEXT, 
        NameParent TEXT, 
        Sector TEXT, 
        CodeSector TEXT, 
        CNUEDSPD TEXT
        )''')

def insert_row(Country, CodeCountryFormat, NamePollutant, NameYearSector, NameParent, Sector, CodeSector, CNUEDSPD):
    c.execute("INSERT INTO unfccc VALUES (?, ?, ?, ?, ?, ?, ?, ?)", (Country, CodeCountryFormat, NamePollutant, NameYearSector, NameParent, Sector, CodeSector, CNUEDSPD))
    conn.commit()

with open('UNFCCC_v20.csv') as csvfile:
    readCSV = csv.reader(csvfile, delimiter='\t')

    counter = 0

    for row in readCSV:
        insert_row(row[0], row[1], row[2], row[3], row[4], row[5], row[6], row[7])
        counter = counter+1
        print('%d down, more to go' % counter)
conn.close()

入力を:memoryに向けて4行目で実行すると、完全に機能し、リレーショナルデータベースだと思います。

ただし、このようなコードを実行しようとすると、dbファイルにデータが書き込まれ、次のエラーが発生します。

 File "<ipython-input-13-4c50216842bc>", line 19, in insert_row
    c.execute("INSERT INTO unfccc VALUES (?, ?, ?, ?, ?, ?, ?, ?)", (Country, CodeCountryFormat, NamePollutant, NameYearSector, NameParent, Sector, CodeSector, CNUEDSPD))

OperationalError: disk I/O error

私はスタックオーバーフローを検索しましたが、Googleを使用しましたが、見つけたどのケースもここでやろうとしていることと一致しないと思います(または、何が起こっているのかを理解する知識がありませんオン)。コードについて気付いたもう1つの点は、データをメモリに非常に高速に入力することですが、dbファイルに書き込むときに本当に遅い場合、SSDを使用しているため、ハードウェアの制限にはなりません。どんな助けでも大歓迎です!

7
Xander Blaauw

Googleドライブに保存されているプロジェクトでの作業中にシステムトレイアイコンで一時停止するようにバックアップ/同期を設定すると、ディスクI/Oエラーを防ぐことができます。

これは、ファイルが書き込まれたり変更されたりすると、バックアップと同期が新しいバージョンをGoogleドライブにアップロードしようとするためです。ファイルは「読み取り専用」ファイルになります。

同期が一時停止されている間、Googleドライブフォルダは通常のディレクトリのように機能します。

(クリック->設定->一時停止/再開)

8
Owen Easter

この問題のもう1つの原因は、ジャーナルファイルは書き込み可能ではないが、SQLiteデータファイルは書き込み可能である場合です。 SQLiteデータファイルが書き込み可能でない場合は、読み取り専用データベースに書き込もうとしていることを示します。しかし、データベースファイルは書き込み可能ですが、ジャーナルファイル(SQLiteデータファイルと同じファイル名で、末尾が-journal)が書き込み可能でない場合は、代わりにI/Oエラーが発生します。

2
Alan Robertson