У меня проблема с возвратом большого списка объектов из функции действия в функцию оркестратора.
У меня есть функция, которая загружает файл 180 МБ и анализирует его. Этот файл создаст список объектов с более чем 962K записей. Каждый объект имеет около 70 свойств, но только около 20% из них заселены.
Когда я запускаю функцию, код успешно загружает и анализирует файл в списке, но когда список возвращается, возникает исключение со следующей информацией:
Исключение: "Исключение при выполнении функции: #######"
- Источник: "System.Private.CoreLib"
Внутреннее исключение: «Ошибка при обработке параметра $ return после возврата функции».
- Источник: "Microsoft.Azure.WebJobs.Host"
Внутреннее / внутреннее исключение: «Исключение типа« System.OutOfMemoryException »было сгенерировано».
- Источник: "System.Private.CoreLib"
Последнее вложенное исключение перечисляет пакет NewtonsoftJson как тот, который выполняет вызов, который генерирует сообщение об ошибке нехватки памяти. Я включаю полную трассировку стека для этого исключения в конце.
Я понимаю, что мог бы сериализовать список объектов и сохранить их в записи BLOB-объекта Azure, а затем просто снова взять его в следующей функции, которая должна его обработать, но я думал, что идея долгосрочных функций заключается в том, чтобы избежать все это и поддерживать стройный рабочий процесс? Кроме того, я основал дизайн на публикации Github «Large Message Support # 26», в которой говорится, что расширения долговременных функций автоматически сохранят полезную нагрузку функции в BLOB-объекте, если размер превысит предел сообщения в очереди (см .: https://github.com/Azure/azure-functions-durable-extension/issues/26).
Что-нибудь нужно сделать, чтобы это заработало?
Код довольно прост:
[FunctionName("GetDataFromSource")]
public static IEnumerable<DataDetail> GetDataFromSource([ActivityTrigger]ISource source, ILogger logger)
{
try
{
string importSettings = Environment.GetEnvironmentVariable(source.SettingsKey);
if (string.IsNullOrWhiteSpace(importSettings))
{
logger.LogError($"No settings key information found for the {source.SourceId} data source"); }
else
{
List<DataDetail> _Data = source.GetVinData().Distinct().ToList();
return vinData;
}
}
catch (Exception ex)
{
logger.LogCritical($"Error processing the {source.SourceId} Vin data source. *** Exception: {ex}");
}
return new List<DataDetail>();
}
Это трассировка стека для самого внутреннего исключения:
at System.Text.StringBuilder.ExpandByABlock(Int32 minBlockCharCount)
at System.Text.StringBuilder.Append(Char value, Int32 repeatCount)
at System.Text.StringBuilder.Append(Char value)
at System.IO.StringWriter.Write(Char value)
at Newtonsoft.Json.JsonTextWriter.WritePropertyName(String name, Boolean escape)
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, Object value, JsonObjectContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter writer, Object value, JsonContract valueContract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerProperty)
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeList(JsonWriter writer, IEnumerable values, JsonArrayContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter writer, Object value, JsonContract valueContract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerProperty)
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.Serialize(JsonWriter jsonWriter, Object value, Type objectType)
at Newtonsoft.Json.JsonSerializer.SerializeInternal(JsonWriter jsonWriter, Object value, Type objectType)
at DurableTask.Core.Serializing.JsonDataConverter.Serialize(Object value, Boolean formatted)
at Microsoft.Azure.WebJobs.Extensions.DurableTask.MessagePayloadDataConverter.Serialize(Object value, Int32 maxSizeInKB) in C:\projects\azure-functions-durable-extension\src\WebJobs.Extensions.DurableTask\MessagePayloadDataConverter.cs:line 55
at Microsoft.Azure.WebJobs.Extensions.DurableTask.MessagePayloadDataConverter.Serialize(Object value) in C:\projects\azure-functions-durable-extension\src\WebJobs.Extensions.DurableTask\MessagePayloadDataConverter.cs:line 43
at Microsoft.Azure.WebJobs.DurableActivityContext.SetOutput(Object output) in C:\projects\azure-functions-durable-extension\src\WebJobs.Extensions.DurableTask\DurableActivityContext.cs:line 136
at Microsoft.Azure.WebJobs.Extensions.DurableTask.ActivityTriggerAttributeBindingProvider.ActivityTriggerBinding.ActivityTriggerReturnValueBinder.SetValueAsync(Object value, CancellationToken cancellationToken) in C:\projects\azure-functions-durable-extension\src\WebJobs.Extensions.DurableTask\Bindings\ActivityTriggerAttributeBindingProvider.cs:line 213
at Microsoft.Azure.WebJobs.Host.Executors.FunctionExecutor.ParameterHelper.ProcessOutputParameters(CancellationToken cancellationToken) in C:\projects\azure-webjobs-sdk-rqm4t\src\Microsoft.Azure.WebJobs.Host\Executors\FunctionExecutor.cs:line 972