Чтение построчно из хранилища BLOB-объектов в Windows Azure

Есть ли способ читать построчно из текстового файла в хранилище BLOB-объектов в Windows Azure ??

Спасибо

Ответы на вопрос(3)

Решение Вопроса

вы можете сделать это с потоками, и это неНе обязательно требовать, чтобы вы извлекли весь файл, хотя, пожалуйста, прочитайте до конца (ответа ... не файла, о котором идет речь), потому что вы все равно можете извлечь весь файл.

Вот код:

StorageCredentialsAccountAndKey credentials = new StorageCredentialsAccountAndKey(
    "YourStorageAccountName",
    "YourStorageAccountKey"
);
CloudStorageAccount account = new CloudStorageAccount(credentials, true);
CloudBlobClient client = new CloudBlobClient(account.BlobEndpoint.AbsoluteUri, account.Credentials);
CloudBlobContainer container = client.GetContainerReference("test");

CloudBlob blob = container.GetBlobReference("CloudBlob.txt");
using (var stream = blob.OpenRead())
{
    using (StreamReader reader = new StreamReader(stream))
    {
        while (!reader.EndOfStream)
        {
            Console.WriteLine(reader.ReadLine());
        }
    }
}

Я загрузил текстовый файл с именем CloudBlob.txt в контейнер с именем test. Размер файла был около 1,37 МБ (на самом деле я использовал файл CloudBlob.cs из GitHub, скопированный в один и тот же файл шесть или семь раз). Я попробовал это с BlockBlob, который, вероятно, то, что выЯ буду иметь дело с текстовым файлом.

Это обычно дает ссылку на BLOB, затем я вызываюOpenRead() из объекта CloudBlob, который возвращает вам BlobStream, который затем можно обернуть в StreamReader, чтобы получить метод ReadLine. Я запустил Fiddler с этим и заметил, что он вызвал три раза дополнительные блоки для завершения файла. Похоже, у BlobStream есть несколько свойств, и вы можете использовать их для настройки объема чтения, который вам нужно сделать, но я не сталпопробуйте их отрегулировать. В соответствии содна ссылка Я обнаружил, что политика повторов также работает на последнем уровне чтения, поэтому она выигралане пытаться перечитать все заново, только последний запрос, который не удался. Цитируется здесь:

Наконец, методы DownloadToFile / ByteArray / Stream / Text () выполняютВся загрузка в одном потоке получить. Если вы используете метод CloudBlob.OpenRead (), он будет использовать абстракцию BlobReadStream, которая будет загружать BLOB-объекты по одному блоку за раз по мере использования. Если возникает ошибка соединения, то необходимо повторно загрузить только этот один блок (в соответствии с настроенным RetryPolicy). Кроме того, это потенциально поможет повысить производительность, поскольку клиенту может не потребоваться кэшировать большой объем данных локально. Для больших двоичных объектов это может существенно помочь, однако имейте в виду, что вы будете выполнять большее количество общих транзакций с сервисом. - Джо Джардино

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

Если это массивные файлы, и вы делаете это много, тогда может произойти много-много транзакций (хотя вы можете посмотреть, можете ли вы изменить свойства BlobStream для увеличения количества блоков, извлекаемых за раз, и т. Д.). Возможно, все еще имеет смысл сделать DownloadFromStream для CloudBlob (который потянет все содержимое вниз), а затем прочитать из этого потока так же, как я делал выше.

Единственное реальное отличие состоит в том, что один тянет меньшие куски за раз, а другой - полный файл сразу. У каждого есть свои плюсы и минусы, и это будет сильно зависеть от размера этих файлов и от того, планируете ли вы остановиться в какой-то момент в середине чтения файла (например, «да, я нашел строку, которую искал!) или если вы все равно планируете прочитать весь файл. Если вы планируете извлекать весь файл, не смотря ни на что (например, потому что вы обрабатываете весь файл), просто используйте DownloadToStream и оберните его в StreamReader.

Примечание: я пробовал это с 1,7 SDK. Я'Я не уверен, какой SDK эти варианты были введены.

 Eman Aldhahri23 окт. 2012 г., 18:29
Как я могу использовать DownloadToStream и обернуть это в StreamReade
 Eman Aldhahri23 окт. 2012 г., 17:37
Как я могу прочитать весь BLOB-объект и сохранить его в потоке, а затем использовать ваш способ читать построчно?
 Eman Aldhahri23 окт. 2012 г., 17:23
Огромное спасибо, что локально работает очень хорошо, но при развертывании в облаке выдает ошибки. Я думаю, потому что долгое время, которое программа потратила, чтобы читать построчно из BLOB-объекта. так что я'Я думаю о втором варианте, о котором вы упомянули: один раз прочитать весь BLOB-объект, а затем прочитать построчно из потока. чтобы прочитать весь блоб, я увидел, что он должен быть в FileStram и сохранить содержимое в файл. Я не могне понимаю, где файл будет и какой путь мне следует использовать, если язапускаю программу в облаке !!
 Eman Aldhahri24 окт. 2012 г., 22:39
Привет MikeWo, это была проблема в связи. поэтому я очень ценю вашу помощь. Ваше решение работает просто отлично. ты самый лучший мужчина.
 MikeWo24 окт. 2012 г., 13:02
Я искал размер файла, в частности, насколько большой файл на диске? Это больше, чем МБ? Также этосделать какую-то операцию "Это займет несколько секунд или минут? Не то, чтобы это имело значение, поскольку потоковая передача просто считывала бы следующий набор блоков, поскольку они им нужны, независимо от промежутка времени между ними. Наконец, отключите пользовательскую обработку ошибок, чтобы увидеть реальную ошибку (msdn.microsoft.com/en-us/library/h0hfz6fc(v=VS.71).aspx) или добавление регистрации в ваше приложение.
 Eman Aldhahri24 окт. 2012 г., 03:29
1- Он сказал, что это ошибка времени выполнения. Ошибка произошла на сервере. Текущие пользовательские настройки ошибок для этого приложения не позволяют удаленно просматривать информацию об ошибке приложения 2 - она содержит 1000 строк и каждый раз при чтении строки выполняют какую-либо операцию, а затем следующую строку
 MikeWo23 окт. 2012 г., 21:18
Хм, я тестировал этот код против учетной записи облачного хранилища, а не против эмулятора. Несколько вещей: 1) Какую ошибку вы получаете, 2) насколько велики эти файлы? и 3) сколько времени занимает ваше приложение, чтобы обработать строку текста, когда оно ее читает?

сохранен в хранилище Azure. Использовался файловый сервис, а не сервис BLOB-объектов.

//https://docs.microsoft.com/en-us/azure/storage/storage-dotnet-how-to-use-files
//https://<storage account="">.file.core.windows.net/<share>/<directory directories="">/<file>
public void ReadAzureFile() {

    CloudStorageAccount account = CloudStorageAccount.Parse(
    CloudConfigurationManager.GetSetting("StorageConnectionString"));
    CloudFileClient fileClient = account.CreateCloudFileClient();
    CloudFileShare share = fileClient.GetShareReference("jiosongdetails");
    if (share.Exists()) {
        CloudFileDirectory rootDir = share.GetRootDirectoryReference();
        CloudFile file = rootDir.GetFileReference("songdetails(1).csv");
        if (file.Exists()) {
            using(var stream = file.OpenRead()) {
                using(StreamReader reader = new StreamReader(stream)) {
                    while (!reader.EndOfStream) {
                        Console.WriteLine(reader.ReadLine());
                }
                }
            }
    }
}
</file></directory></share></storage>

вам нужно будет написать код, чтобы сначала загрузить BLOB-объект локально, а затем прочитать его содержимое. Это главным образом потому, что вы не можете просто попасть в блоб и прочитать его содержимое посередине. Если вы использовали Windows Azure Table Storage, вы наверняка сможете прочитать конкретное содержимое в таблице.

Поскольку ваш текстовый файл представляет собой большой двоичный объект и находится в хранилище больших двоичных объектов Azure, вам действительно нужно локально загрузить большой двоичный объект (в виде локального большого двоичного объекта или потока памяти) и затем прочитать содержимое в нем. Вам нужно будет загрузить блоб полностью или частично, в зависимости от типа загруженного вами блоба. С помощью блобов страниц вы можете загружать контент определенного размера локально и обрабатывать его. Было бы здорово узнать оРазница между блоком и страницей блоб на этот счет.

 Eman Aldhahri22 окт. 2012 г., 23:42
Спасибо вам за то, что я понял от вас, что я должен читать содержимое хранилища больших двоичных объектов и сохранять его как поток, тогда как я могу читать построчно из потока?
 smarx23 окт. 2012 г., 00:30
Это не совсем правильно, поскольку хранилище BLOB-объектов (для обоих типов BLOB-объектов) поддерживает запросы диапазона. Но это был бы неэффективный способ сделать это, инет никакого способа "читать до следующей новой строки " только "читать N байтов ".

Ваш ответ на вопрос