Использование c # для генерации и 100000 записей в базу данных postgres - PullRequest
2 голосов
/ 22 августа 2011

Я программирую проект на языке c #, в котором создается много записей, которые необходимо сохранить в базе данных.На данный момент я делаю (что ОЧЕНЬ медленно), чтобы сохранить все эти результаты в виде списка структур.Затем в конце выполните эту структуру и добавьте все записи в строку запроса SQL.Проблема в том, что для перебора списка требуются целые века, когда он содержит 100 000 элементов.Вставки аналогичного размера необходимо выполнить несколько раз в симуляции.Я подумал о том, чтобы просто сохранить строку в выключенном состоянии, а не хранить записи в списке и поместить ее в строку напрямую.Также возможно их хранение во временном файле и использование SQL-копии.У меня нет особого опыта работы с таким количеством данных, поэтому ваши отзывы будут оценены.

Заранее спасибо

Ответы [ 3 ]

1 голос
/ 22 августа 2011

Вам следует попробовать заполнить файл данными, а затем использовать встроенную команду COPY. Это рекомендуемый метод заполнения базы данных. http://www.postgresql.org/docs/8.3/interactive/sql-copy.html

При создании временного файла CSV соблюдайте спецификацию CSV. Если данные вашего столбца содержат новые строки (\ n \ r), запятые (,) или кавычки ("), тогда экранируйте кавычки (") с кавычками

data=data.Replace("\"", "\"\"");

и окружить данные кавычками

data="\""+data+"\"";

Что-то вроде

public String CSVEscape(String columnData)
{
    if(columnData.Contains("\n") || columnData.Contains("\r") || columnData.Contains("\"") || columnData.Contains(","))
    {
        return "\"" + columnData.Replace("\"", "\"\"") + "\"";
    }
    return columnData;
}
1 голос
/ 23 августа 2011

Если я правильно читаю ваш вопрос, вы отправляете серверу PostgreSQL строку, которая выглядит примерно так:

INSERT INTO mytable (x, y, z) VALUES (1,2,3), (4,5,6), ...

Вместо этого вы должны сделать

  1. начать транзакцию
  2. подготовить оператор INSERT INTO mytable (x, y, z) VALUES ($1, $2, $3)
  3. для каждой структуры в вашем списке, выполнить подготовленный оператор с соответствующими полями
  4. зафиксировать транзакцию

(Извините, нет кода, потому что я не знаю API БД C #.)

Я бы не потрудился выяснить COPY IN, если описанный мной подход все еще слишком медленный.Я нервничаю, когда для вставки данных в базу данных требуются какие-либо текстовые манипуляции.

0 голосов
/ 22 августа 2011

Если у вас низкая производительность при использовании ООП-подхода, поэтому первым делом необходимо использовать структуры / классы, чтобы максимально измерить и оптимизировать код.

Если производительность даже после оптимизации не очень хорошаяв вашем конкретном контексте я бы оставил подход ООП и перешел к необработанному SQL.

Одним из решений может быть, как вы сказали в посте, при генерации строки для каждой отдельной сущности, немедленно добавить ее в большой файлгде в конце поколения вы найдете полную огромную строку SQL.Проблема здесь в проверяемости решения.

Но, вы знаете, где-то вам нужно «заплатить».Вы не можете иметь comfott и современника представления в таком масштабе.

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