Доступ к огромным данным с удаленного сервера в C # - PullRequest
0 голосов
/ 12 июня 2009

У меня есть база данных в Нью-Йорке, и мои пользователи HK пытаются получить данные из этой базы данных. Полученные данные составляют приблизительно 20 МБ (если сохранить Datatable как CSV, размер файла составит 20 МБ). На получение данных уходит около 20 минут.

Я использую SQL Server 2005 в качестве базы данных и c # в качестве настольного приложения. У меня не может быть отдельной базы данных для пользователей HK из-за бюджетных ограничений.

Может кто-нибудь предложить способ довести время поиска примерно до 5 минут?

С уважением,

Паван

Ответы [ 6 ]

1 голос
/ 12 июня 2009

Пара мыслей;

  1. 20 МБ за 20 минут - это около 17 Кбит / с, что крайне медленно. Есть ли другие моменты в вашем процессе, которые увеличивают задержку?
  2. С точки зрения возможного решения, возможно, рассмотрите возможность использования конечной точки HTTP и включите сжатие gzip. Это больше не будет соединение ado.net, но размер ваших данных должен значительно уменьшиться, и в зависимости от структуры вашего приложения его реализация может быть довольно простой. Подробнее здесь .

Удачи!

0 голосов
/ 13 июня 2009

Единственное, что я должен добавить, это убедиться, что вы устанавливаете RemotingFormat в Binary. Не уверен, что вам удастся просто установить его в свой DataSet или вам нужно это сделать и для всех DataTables. По привычке я всегда устанавливаю оба значения в двоичный.

По моему опыту, DataTable данных будет сериализован до меньшего размера, чем, например, сопоставимый строго типизированный массив некоторого соответствующего объекта.

О, последнее. Вы сэкономите немного больше места, если сможете установить значение AllowNull в false для столбцов, которые в этом не нуждаются.

0 голосов
/ 12 июня 2009

Мы используем набор CompressedDataSet, производный от набора данных. Имеет две добавленные функции:

public string GetCompressedDataSet()
public void SetCompressedDataSet(string data)

Эти функции (де) сериализуют набор данных в XML, а затем используют GZip для (де) сжатия. Сжатие ваших наборов данных имеет большое значение.

Конечно, вам действительно нужны данные 20 Мб? Это может быть возможность ограничить запрашиваемые вами данные. Или разделите его: попросите 10x2 МБ и обновляйте приложение каждые 2 минуты.

0 голосов
/ 12 июня 2009

Просто мысль, вы пытались GZIPпроверять данные, когда они передаются по проводам? Я считаю, что дампы SQL сжимаются особенно хорошо, иногда до 90%. Конечно, это зависит от того, насколько легко вы выполняете запрос.

Если вы выполняете прямой запрос SQL от HK через Интернет к серверу базы данных в Нью-Йорке, это, вероятно, не очень хорошая идея, вы можете написать оболочку, которая выполняет запрос и затем сжимает результат перед передачей на удаленный сайт .

0 голосов
/ 12 июня 2009

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

0 голосов
/ 12 июня 2009

Попробуйте получить только те данные, которые вам нужны. Вы можете сделать это, написав веб-сервис для возврата соответствующих данных, хотя вам необходимо убедиться, что он безопасен.

В качестве альтернативы, установите базу данных SQL Server Express в HK - она ​​бесплатна и будет поддерживать до 4 ГБ данных, хотя вам придется найти способ репликации данных, чтобы она соответствовала 2 средам.

Кажется чрезмерным возвращать все 20 МБ данных из базы данных за один запрос. Предположительно, для этого есть веская причина?

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