Можно ли использовать более 1,5 ГБ памяти с помощью приложения-функции Azure V2 - PullRequest
0 голосов
/ 16 октября 2018

В настоящее время я использую v2 приложения-функции Azure.Я установил 64-битную среду и собираю .Net Standard 2.0.Хост Json указывает версию 2.

Я читаю в .csv, и он отлично работает для небольших файлов.Но когда я читаю 180 МБ .csv в Список строк [], при чтении он увеличивается до более чем ГБ, а когда я пытаюсь его проанализировать, он превышает 2 ГБ, но затем выдает исключение «Недостаточно памяти».Даже выполнение плана обслуживания приложений с более чем 3,5 ГБ не решило проблему.

Редактировать: я использую это:

Uri blobUri = AppendSasOnUri(blobName); _webClient = new WebClient(); 
Stream sourceStream = _webClient.OpenRead(blobUri); 
_reader = new StreamReader(sourceStream);

Однако, поскольку это CSV, я разделяю целые столбцы данных.От этого довольно трудно уйти:

internal async Task<List<string[]>> ReadCsvAsync() { 
    while (!_reader.EndOfStream) { 
        string[] currentCsvRow = await ReadCsvRowAsync(); 
        _fullBlobCsv.Add(currentCsvRow); 
    } 
return _fullBlobCsv; }

Цель состоит в том, чтобы сохранить json в blob, когда все сказали и сделали.

1 Ответ

0 голосов
/ 16 октября 2018

Попробуйте использовать поток (StreamReader) для чтения входного файла .csv и обработки по одной строке за раз.

Я могу проанализировать 300 МБ файлов в плане потребления с потоками.Мой вариант использования может быть не таким же, но похожим.Разобрать большой объединенный файл PDF, разделить его на более 5000 файлов меньшего размера и сохранить отдельные файлы в контейнере BLOB-объектов.Ниже приведен мой код для справки.

Для вашего случая использования вы можете использовать CloudAppendBlob вместо CloudBlockBlob, если вы помещаете все проанализированные данные в один большой двоичный объект.

public async static void ExtractSmallerFiles(CloudBlockBlob myBlob, string fileDate, ILogger log)
{
    using (var reader = new StreamReader(await myBlob.OpenReadAsync()))
    {
        CloudBlockBlob blockBlob = null;
        var fileContents = new StringBuilder(string.Empty);
        while (!reader.EndOfStream)
        {
            var line = reader.ReadLine();
            if (line.StartsWith("%%MS_SKEY_0000_000_PDF:"))
            {
                var matches = Regex.Match(line, @"%%MS_SKEY_0000_000_PDF: A(\d+)_SMFL_B1234_D(\d{8})_A\d+_M(\d{15}) _N\d+");
                var smallFileDate = matches.Groups[2];
                var accountNumber = matches.Groups[3];
                var fileName = $"SmallerFiles/{smallFileDate}/{accountNumber}.pdf";
                blockBlob = myBlob.Container.GetBlockBlobReference(fileName);
            }
            fileContents.AppendLine(line);
            if (line.Equals("%%EOF"))
            {
                log.LogInformation($"Uploading {fileContents.Length} bytes to {blockBlob.Name}");
                await blockBlob.UploadTextAsync(fileContents.ToString());
                fileContents = new StringBuilder(string.Empty);
            }
        }
        await myBlob.DeleteAsync();
        log.LogInformation("Extracted Smaller files");
    }
}
...