我最近阅读了关于SQLite vs MySQL的这个问题,答案指出SQLite不能很好地扩展,官方网站排序也证实了这一点.
SQLite的可扩展性如何?它的最大限制是什么?
我正在尝试将csv文件导入SQLite表.
示例csv:
1,2
5,6
2,7
Run Code Online (Sandbox Code Playgroud)
示例命令:
sqlite> create table foo(a, b);
sqlite> separator ,
sqlite> .import test.csv foo
Error: test.csv line 1: expected 2 columns of data but found 4
Run Code Online (Sandbox Code Playgroud)
我甚至不确定为什么它会找到包含六个数据和两列的四列.有帮助吗?:)
我读到了这一点:使用Python将CSV文件导入sqlite3数据库表
并且似乎每个人都建议使用逐行阅读而不是使用SQLite的批量.import.但是,如果您有数百万行数据,这将使插入真的很慢.有没有其他方法来规避这个?
更新:我尝试了以下代码逐行插入,但速度不如我预期的那么好.无论如何都要改进它
for logFileName in allLogFilesName:
logFile = codecs.open(logFileName, 'rb', encoding='utf-8')
for logLine in logFile:
logLineAsList = logLine.split('\t')
output.execute('''INSERT INTO log VALUES(?, ?, ?, ?)''', logLineAsList)
logFile.close()
connection.commit()
connection.close()
Run Code Online (Sandbox Code Playgroud) 当我将csv文件导入sqlite数据库时,它将数字作为字符串导入整数列,我该如何解决这个问题呢?我的csv文件中的一行如下:
31,c,BB ROSE - 031,c31,,9,7,0,"142,000",0
Run Code Online (Sandbox Code Playgroud) 在grep从查找文件的长行中的模式文件中找到一个短模式的地方,我需要一个工具来允许我提取可以在更长模式中找到的查找文件的短行.
换句话说,鉴于莎士比亚的作品每行一句并说法语词典,我想找到哪些法语单词在莎士比亚的哪一行中找到,从而可以发现莎士比亚的一行可能包含更多的事实不止一个法语单词,而且法语单词可能出现在莎士比亚的不止一行中.
例如:
pattern_file={
"The sun is shining!"
"It is a beautiful day!"}
lookup_file={
"Rain"
"Sun"
"Cloud"
"Beautiful"
"Shining"}
Run Code Online (Sandbox Code Playgroud)
我想要的是什么
function file pattern
Run Code Online (Sandbox Code Playgroud)
给出在较长模式中找到的行和由昏迷分隔的较长模式本身,同时检测多个匹配.
ideal_result_file={
"Sun","The sun is shining!"
"Beautiful","It is a beautiful day!",
"Shining", "The sun is shining!"}
Run Code Online (Sandbox Code Playgroud)
目前,我使用grep逐行遍历整个查找文件:
while read line
do
grep -is $line pattern_file | sed 's/^/'"$line"'\,/g' >> result_file.csv
done < lookup_file
Run Code Online (Sandbox Code Playgroud)
这非常慢!我的lookup_file包含超过50 000行,而我的pattern_file包含500.使用grep在lookup_file中查找更短的模式需要几秒钟,使用我的循环方法的单次传递需要一天/几周.
任何语言的解决方案将不胜感激.
与
在大型数据集上使用grep或fgrep的非常慢的循环
相比,Perl比bash更快吗?
该解决方案需要与GB大小的循环和模式文件兼容.
我有一个包含 7946479 条记录的文件,我想逐行读取该文件并插入到数据库(sqlite)中。我的第一种方法是打开文件逐行读取记录并同时插入数据库,因为它处理大量数据,需要很长时间。我想改变这种幼稚的方法,所以当我在互联网上搜索时我看到了这个 [python-csv-to-sqlite][1] ,他们在 csv 文件中有数据,但我的文件是dat格式,但我喜欢这个问题的答案,所以现在我尝试这样做在解决方案中。
/sf/ask/415968171/
他们使用的方法就像首先将整个文件分成块,然后执行数据库事务,而不是一次写入每条记录。
所以我开始编写一个代码来将我的文件分割成块这是我的代码,
file = r'files/jan.dat'
test_file = r'random_test.txt'
def chunks(file_obj, size=10000):
counter = 0
file_chunks = []
temp_chunks = []
for line in file_obj:
if line == '\n':
continue
if counter != size:
temp_chunks.append(line)
counter += 1
else:
file_chunks.append(temp_chunks)
temp_chunks = []
counter = 0
file_obj.close()
if len(temp_chunks) != 0:
file_chunks.append(temp_chunks)
yield file_chunks
if __name__ == '__main__':
split_files = chunks(open(test_file))
for chunk in split_files:
print(len(chunk))
Run Code Online (Sandbox Code Playgroud)
输出是 795,但我想要的是将整个文件分割成大小为 10000 的块
我不知道这里出了什么问题,我无法在这里共享我的整个文件,因此为了测试可以使用此代码生成一个包含 …