我正在尝试将数百万条记录,甚至数十亿条记录插入到Cassandra数据库中。有没有更快的方法来做到这一点?它每个文件花30分钟,我有100多个文件。我需要遍历某个目录中的每个文件并遍历所有行,并将每个文件的每一行插入到Cassandra数据库中。这些文件的大小各不相同,最大为1KB到300,000 KB。
我所指的是9734KB,并且已经处理了30分钟而没有完成。肯定有一种更快的方式来插入记录?其处理的文件有942,345行。
按照这个速度,它需要几天时间来插入所有这些记录。
使用和不使用批次尝试,两者的速度相同(大致)
Console.CursorVisible = false;
var cluster = Cluster.Builder().AddContactPoints("127.0.0.1").Build();
var session = cluster.Connect("cracking");
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine();
Console.WriteLine(" [" + DateTime.Now.ToShortTimeString() + "]" + " Connected to the Cassandra Database");
Console.WriteLine();
Console.ForegroundColor = ConsoleColor.White;
string filepath = @"C:\Users\admin\Desktop\wecrack lists\test";
DirectoryInfo directory = new DirectoryInfo(filepath);
int fileCount = 0;
foreach (var file in directory.GetFiles("*"))
{
fileCount++;
Console.WriteLine(" [" + DateTime.Now.ToShortTimeString() + "]" + " Working through file: {" + file + "} {" + fileCount + "/" + directory.GetFiles("*").Count() + "}");
var lines = File.ReadLines(filepath + @"\" + file.ToString()).ToList();
var batch = new BatchStatement();
int lineCount = 0;
while (lines.Count > 0)
{
foreach (string line in lines.ToList())
{
if (lineCount >= 2000)
{
lineCount = 0;
Console.WriteLine(" [" + DateTime.Now.ToShortTimeString() + "]" + " Changing batch for file: {" + file + "} {" + fileCount + "/" + directory.GetFiles("*").Count() + "}");
session.Execute(batch);
batch = new BatchStatement();
break;
}
lineCount++;
lines.Remove(line);
var userTrackStmt = session.Prepare("INSERT INTO passwords (id, password) VALUES (?, ?)");
batch.Add(userTrackStmt.Bind(Guid.NewGuid(), line));
}
}
}
Console.WriteLine();
Console.WriteLine(" [" + DateTime.Now.ToShortTimeString() + "]" + " Finished inserting records, press any key to get the count.");
Console.ReadKey(true);
Console.WriteLine();
Console.ForegroundColor = ConsoleColor.Cyan;
Console.WriteLine(" " + string.Format("{0:n0}", session.Execute("SELECT * FROM passwords").Count()) + " records.");
while (true)
{
Console.ReadKey(true);
}
答案 0 :(得分:1)
每次使用时都不需要准备语句。您应该准备一次并为每个插入操作绑定。
此外,您应该根据user23477763的建议将问题分开。您将能够隔离创建许多列表的成本并从这些列表的开头删除。
您不需要批量处理,因为批处理会为您提供您不需要的交易保证。如果不知道您的架构是什么样的,就很难知道确切的影响是什么。看看https://docs.datastax.com/en/cql/3.3/cql/cql_using/useBatchBadExample.html
另请注意,您可以并行向cassandra发送多个插入操作。