c # Как вставить огромное количество данных в таблицу Cassandra - PullRequest
1 голос
/ 08 ноября 2019

Уважаемые,

Я пытаюсь вставить около 100 000 строк в базу данных Cassandra с помощью приложения C #.

Для достижения этой цели я использую nuget:

https://www.nuget.org/packages/CassandraCSharpDriver/

Я установил Cassandra локально на моем ноутбуке (i5, 32 ГБ ОЗУ, Windows 10).

Настройки моего Cassandra по умолчанию:

var cluster = Cluster.Builder()
                                 .AddContactPoints(CassandraContactPoint)
                                 .WithPort(CassandraPort)
                                 .WithLoadBalancingPolicy(new DCAwareRoundRobinPolicy("datacenter1"))
                                 .WithAuthProvider(new PlainTextAuthProvider(UserName, Password))
                                 .Build();

Таблица Cassandraвыглядит следующим образом:

            session.Execute("DROP KEYSPACE IF EXISTS eventstore");
            session.Execute("CREATE KEYSPACE eventstoreWITH REPLICATION = { 'class' : 'NetworkTopologyStrategy', 'datacenter1' : 1 };");

            session.Execute(@"
                                CREATE TABLE IF NOT EXISTS eventstore.Event(
                                Id uuid, 
                                Data text, 
                                Version int,
                                AgregateId uuid,
                                EventIdentity uuid,
                                Date timestamp,
                                  PRIMARY KEY (AgregateId,Version)
                                ) WITH CLUSTERING ORDER BY (Version ASC)");

Для вставки событий я использую следующий код:

переменная events содержит 2000 событий, которые вставляются за 3 секунды.

            var tasks = events.Select(async @event =>
            {
                await mapper.InsertAsync(@event);
            });

            await Task.WhenAll(tasks);

На данный момент производительность этого решения составляет около 3 секунд для 2000 событий. Можно быстрее вставить данные ??

1 Ответ

3 голосов
/ 08 ноября 2019

Есть несколько методов, которые вы можете использовать, чтобы посылать постоянный поток выполнения, одновременно ограничивая уровень параллелизма.

В хранилище драйверов есть пример: https://github.com/datastax/csharp-driver/blob/master/examples/ConcurrentExecutions/ExecuteInLoop/Program.cs

Также естьтема в руководстве разработчика драйверов DataStax: https://docs.datastax.com/en/devapp/doc/devapp/driverManagingConcurrency.html

При параллельной отправке нескольких запросов запросы ставятся в очередь на одном из трех уровней: на стороне драйвера, в сетевом стеке илина стороне сервера. Чрезмерная постановка в очередь на любом из этих уровней влияет на общее время, необходимое для завершения каждой операции. Настройте уровень параллелизма или количество одновременных запросов, чтобы уменьшить объем очереди и получить высокую пропускную способность и низкую задержку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...