Загрузка больших файлов в WSS v3

Я создал приложение WSSv3, которое загружает файлы небольшими порциями; когда приходит каждый фрагмент данных, я временно сохраняю его в поле типа данных изображения SQL 2005 по соображениям производительности **.

Проблема возникает, когда загрузка заканчивается; Мне нужно переместить данные с моего SQL Server в библиотеку документов Sharepoint через объектную модель WSSv3.

Прямо сейчас я могу придумать два подхода:

SPFileCollection.Add(string, (byte[])reader[0]); // OutOfMemoryException

а также

SPFile file = folder.Files.Add("filename", new byte[]{ });
using(Stream stream = file.OpenBinaryStream())
{
    // ... init vars and stuff ...
    while ((bytes = reader.GetBytes(0, offset, buffer, 0, BUFFER_SIZE)) > 0)
    {
        stream.Write(buffer, 0, (int)bytes); // Timeout issues
    }
    file.SaveBinary(stream);
}

Есть ли другой способ успешно выполнить эту задачу?

** Причины производительности: если вы попытаетесь записать каждый фрагмент непосредственно в Sharepoint, вы заметите снижение производительности по мере увеличения размера файла (> 100 МБ).


person Rubens Farias    schedule 28.09.2009    source источник
comment
Каков средний и максимальный размер файлов?   -  person Alex Angas    schedule 28.09.2009
comment
большинство файлов меньше 5 МБ; большие файлы (~ 500 МБ) - это всего лишь небольшой набор   -  person Rubens Farias    schedule 29.09.2009


Ответы (3)


Я закончил следующим кодом:


myFolder.Files.Add("filename", 
   new DataRecordStream(dataReader, 
      dataReader.GetOrdinal("Content"), length));

Вы можете найти Реализация DataRecordStream здесь. По сути, это поток, который читает данные с DbDataRecord по .GetBytes

Этот подход похож на OpenBinaryStream()/SaveBinary(stream), но он не сохраняет весь байт [] в памяти при передаче данных. В какой-то момент доступ к DataRecordStream будет осуществляться из Microsoft.SharePoint.SPFile.CloneStreamToSPFileStream с использованием блоков размером 64 КБ.

Всем спасибо за ценную информацию!

person Rubens Farias    schedule 30.09.2009

Первое, что я хотел бы сказать, это то, что SharePoint действительно, действительно не предназначен для этого. Он хранит все файлы в своей собственной базе данных, так что именно туда собираются эти большие файлы. Это не лучшая идея по множеству причин: масштабируемость, стоимость, резервное копирование / восстановление, производительность и т. Д. Поэтому я настоятельно рекомендую вместо этого использовать общие файловые ресурсы.

Вы можете увеличить время ожидания веб-запроса, изменив атрибут executionTimeout элемента http://msdn.microsoft.com/en-us/library/e1f13641.aspx.

Кроме того, я не уверен, что еще предложить. Я не слышал о таких больших файлах, хранящихся в SharePoint. Если это абсолютно необходимо, попробуйте также спросить о сбое сервера.

person Alex Angas    schedule 29.09.2009
comment
привет Алекс, спасибо за комментарии. Я знаю об этих проблемах: я создаю приложение wss для замены общего сетевого ресурса (в основном для ограничения полосы пропускания); в то время как пользователи должны использовать это приложение для небольших файлов, следует учитывать и большие. У меня нет проблем с HttpRuntime, так как я загружаю файлы несколькими кусками - person Rubens Farias; 30.09.2009

Как упоминалось ранее, хранить большие файлы в Sharepoint, как правило, - плохая идея. См. Эту статью для получения дополнительной информации: http://blogs.msdn.com/joelo/archive/2007/11/08/what-not-to-store-in-sharepoint.aspx

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

К счастью, поскольку вы можете реализовать своего собственного внешнего поставщика BLOB-объектов, вы можете написать что-нибудь, чтобы лучше обрабатывать эти конкретные файлы. Подробнее см. В этой статье: http://207.46.16.252/en-us/magazine/2009.06.insidesharepoint.aspx

Стоит ли это накладных расходов или нет, зависит от того, какая у вас проблема. :)

person Brett Coburn    schedule 29.09.2009
comment
Интересные ссылки Бретт, я их внимательно изучу; прямо сейчас я должен закончить это приложение таким образом; Ты на свое время - person Rubens Farias; 30.09.2009
comment
@Brett: Есть компания, которая разработала полное решение для внешнего хранилища для SharePoint. Не могу вспомнить имя или найти его сейчас ... Выглядит интересно - person Alex Angas; 30.09.2009