C# Linq-to-Sql - Если DataContext расположены с помощью IDisposable

Добро пожаловать в pandas! Это довольно трудная проблема, потому что похоже, что вы хотите делать сравнения 1e5 * 1e5, что не будет быстрым, независимо от того, что мы делаем, поэтому давайте попробуем ограничить это как можно больше. Во-первых, сделайте все возможное, чтобы разумно ожидать, что соответствующие индексы будут близки. Во-вторых, вот код, который немного упростит ваше сопоставление.

Для двух серий x_row и y_row:

> x_row = pd.Series([1, 2, 0, 4])
> y_row = pd.Series([1, 2, 3, 4])
> ((x_row == y_row) | (x_row == 0)).all()
True

Эта последняя строка является побитовой или (|) между двумя проверками: сначала, если каждое значение соответствует соответствующему значению в другой серии (T, T, F, T) или значение в x_row равно нулю (F F T F). Битовый или из этих двух логических рядов равен T T T T, поэтому в результате получается .all() Истина.

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

x2y = []
unmatched_x = []
unmatched_y = df_y.index.tolist()
for x_idx, x_row in df_x:
    match = False
    for y_idx in unmatched_y:
        if ((x_row == df_y.loc[y_idx]) | (x_row == 0)).all():
            match = True
            break
    if match:
        unmatched_y.remove(y_idx)
        x2y.append(x_idx, y_idx)
    else:
        unmatched_x.append(x_idx)

Если вы думаете, что большинство из них совпадают, вы можете отсортировать те, которые делают, запустив

matches = ((df_x == df_y) | (df_x == 0)).all(axis=1)

Это делает то же самое, но на весь фрейм данных сразу. Он вернет последовательность логических значений, соответствующую тому, соответствует ли каждая строка в df_x соответствующей строке в df_y. Тогда вы можете сортировать тех, кто этого не делает.
df_x[matches] будут только строки, которые соответствуют, или df_x[~matches] будут те, которые не соответствуют.

27
задан Mark Byers 17 May 2010 в 09:13
поделиться

1 ответ

В отличие от большинства типов, которые реализуют IDisposable, DataContext не действительно нужно избавиться - по крайней мере, нет в большинстве случаев. Я спросил Мэтта Уоррена об этом дизайнерском решении, а здесь был его ответ:

Есть несколько причин, которые мы реализовали IDisposable:

  • Если логике приложения необходимо удерживать сущность за пределами, когда Ожидается использование DataContext или действительно, вы можете обеспечить выполнение этого контракта путем вызывая утилизировать. Отложенные погрузчики в эта сущность все еще будет ссылаться DataContext и постараюсь его использовать если какой-либо код пытается перемещаться отложенные свойства. Эти попытки не удастся. Распоряжаться также заставляет DataContext для сброса своего кэша материализованные объекты, так что один кэшированная сущность не будет случайно поддерживать в живых все сущности через этот DataContext, который будет в противном случае вызвать то, что кажется утечка памяти.
  • Логика, которая автоматически закрывает соединение DataContext, может быть обманом ушел из соединения открыто. DataContext опирается на код приложения, перечисляющий все Результаты запроса с момента получения до конец результирующего набора вызывает соединение закрыть. Если приложение использует IEnumerable Метод MoveNext вместо foreach заявление в C # или VB, вы можете выйти Перечень преждевременно. Если ваш приложение испытывает проблемы с соединения не закрываются и вы подозреваю автоматическое закрытие не работает, вы можете использовать утилизацию шаблон как обходной путь.

из источника

29
ответ дан 28 November 2019 в 05:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: