Сначала выберите верхнюю первую запись с флагом = 1 для каждой даты и установите цель на 1
df1 = df[df.flag==1].groupby("date").head(1);
df1.target = 1
Затем сбросьте цель на 0 для исходного кадра данных и замените значение цели на вновь созданный кадр данных с целью только на 1 для тех записей, которые выбраны в первом кадре данных.
df.target = 0
df.update(df1.target)
Единственной самой большой вещью, которая уничтожит производительность здесь, является то, что (она походит), Вы выполняете миллион различных ВСТАВОК против DB. Каждого ВСТАВКА рассматривают как единственную операцию. Если можно сделать это как единственную операцию, то у Вас почти наверняка будет огромное повышение производительности.
И MySQL и поддержка SQL Server 'выбирают' константных выражений без имени таблицы, таким образом, это должно работать одним оператором:
INSERT INTO MyTable(ID, name)
SELECT 1, 'Fred'
UNION ALL SELECT 2, 'Wilma'
UNION ALL SELECT 3, 'Barney'
UNION ALL SELECT 4, 'Betty'
Это не ясно мне если поддержки Доступа что, не имея Доступ в наличии. ОДНАКО Доступ действительно поддерживает константы в ВЫБОРЕ, насколько я могу сказать, и можно принудить вышеупомянутое в ANSI SQL-92 (который должен поддерживаться всеми 3 механизмами; это о как близко к 'агностику DB', поскольку Вы доберетесь), просто добавив
FROM OneRowTable
в конец каждого отдельного ВЫБОРА, где 'OneRowTable' является таблицей со всего одной строкой фиктивных данных.
Это должно позволить Вам вставить миллион строк данных в очень намного меньше чем миллионе операторов INSERT - и вещи как индекс, переставляющий, будут сделаны однажды, а не миллион раз. У Вас может быть намного меньше потребности в других оптимизациях после этого.
Для SQL Server:
Отключение индексов является на самом деле хорошей идеей. Это будет работать над SQL 2005, не над SQL Server 2000.
изменитесь индекс [INDEX_NAME] на [TABLE_NAME] отключают
И включить
alter index [INDEX_NAME] on [TABLE_NAME] rebuild
И затем просто вставьте строки один за другим. Необходимо быть терпеливыми, но по крайней мере это несколько быстрее.
действительно ли это - регулярный процесс или одно событие времени?
Я имею, в прошлом просто заданный сценарием текущие индексы, отбросил их, вставил строки, затем просто повторно добавьте индексы.
Studio управления SQL может написать сценарий индексов из меню правой кнопки...
Проблема установить модель восстановления на простой состоит в том, что она влияет на любых других пользователей, вводящих данные одновременно, и таким образом будет amke их неисправимые изменения.
Вещь Samre с отключением индексов, это отключает для всех и может сделать базу данных выполненной медленнее, чем краткий заголовок.
Предположите выполнение импорта в пакетах.
Если это - одноразовая вещь (или это, оказывается, достаточно часто выравнивает по ширине автоматизацию этого), также рассмотрение отбрасывания/отключения всех индексов и затем добавления/перевключения их снова, когда вставка сделанный
Вы рассмотрели использование Шаблона "фабрика"? Я предполагаю, что Вы пишете код для этого, поэтому при использовании шаблона "фабрика", Вы могли кодировать фабрику, которая возвратила конкретный класс типа "IDataInserter", который сделает работу для.
Это все еще позволило бы Вам быть агностиком данных и получать самый быстрый метод для каждого типа базы данных.
Если это не что-то, что должно быть считано ужасно быстро, можно сделать, "Вставляют Отложенный" в таблицу на MySQL. Это позволяет Вашему коду продолжать работать, не имея необходимость ожидать вставки для фактического случая. Это действительно имеет некоторые ограничения, но если Ваша первоочередная задача состоит в том, чтобы заставить программу заканчиваться быстро, это может помочь. Предупредите, что существует хороший длинный список ситуаций, где это не может действовать как ожидалось. Проверьте документы.
Я не знаю, работает ли эта функциональность на Доступ или MS SQL, все же.
Можно ли использовать DTS (2000) или SSIS (2005) для создания пакета, чтобы сделать это? DTS и SSIS могут и вытянуть из того же источника и передать по каналу различным потенциальным местам назначения. Пойдите для SSIS, если Вы можете. Существует большая хорошая, быстрая технология там наряду с функциональностью для встраивания IsSQLServer, IsMySQL, и т.д. логики.
SQL Server 2000/2005, MySQL и Доступ может все загрузиться непосредственно от вкладки / cr текстовый файл, у них просто есть различные команды, чтобы сделать это. Если у Вас есть оператор выбора для определения, который DB Вы импортируете в просто фигуру их предпочтение импорта текстового файла.
Вы могли бы рассмотреть использование модели восстановления SQL с массовым протоколированием во время своей объемной вставки.
http://msdn.microsoft.com/en-us/library/ms190422 (SQL.90) .aspx
http://msdn.microsoft.com/en-us/library/ms190203 (SQL.90) .aspx
Вы могли бы также отключить индексы на целевой таблице во время Ваших вставок.
Стоит рассмотреть разбиение ваших вставок на более мелкие партии ; одна транзакция с большим количеством запросов будет медленной.