Размещение в ОЗУ файлов по сравнению с [закрытым] CreateFile/ReadFile

Пользовательский атрибут KinSlayerUY работал хорошо для меня, но у меня были проблемы с ComplexTypes. Они были сопоставлены как сущности в коде атрибута, поэтому не могли затем отображаться как ComplexType.

Поэтому я расширил код, чтобы это можно было сделать:

public static void OnModelCreating(DbModelBuilder modelBuilder)
    {
        foreach (Type classType in from t in Assembly.GetAssembly(typeof(DecimalPrecisionAttribute)).GetTypes()
                                   where t.IsClass && t.Namespace == "FA.f1rstval.Data"
                                   select t)
        {
            foreach (var propAttr in classType.GetProperties(BindingFlags.Public | BindingFlags.Instance).Where(p => p.GetCustomAttribute<DecimalPrecisionAttribute>() != null).Select(
                   p => new { prop = p, attr = p.GetCustomAttribute<DecimalPrecisionAttribute>(true) }))
            {

                ParameterExpression param = ParameterExpression.Parameter(classType, "c");
                Expression property = Expression.Property(param, propAttr.prop.Name);
                LambdaExpression lambdaExpression = Expression.Lambda(property, true,
                                                                         new ParameterExpression[] { param });
                DecimalPropertyConfiguration decimalConfig;
                int MethodNum;
                if (propAttr.prop.PropertyType.IsGenericType && propAttr.prop.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>))
                {
                    MethodNum = 7;
                }
                else
                {
                    MethodNum = 6;
                }

                //check if complextype
                if (classType.GetCustomAttribute<ComplexTypeAttribute>() != null)
                {
                    var complexConfig = modelBuilder.GetType().GetMethod("ComplexType").MakeGenericMethod(classType).Invoke(modelBuilder, null);
                    MethodInfo methodInfo = complexConfig.GetType().GetMethods().Where(p => p.Name == "Property").ToList()[MethodNum];
                    decimalConfig = methodInfo.Invoke(complexConfig, new[] { lambdaExpression }) as DecimalPropertyConfiguration;
                }
                else
                {
                    var entityConfig = modelBuilder.GetType().GetMethod("Entity").MakeGenericMethod(classType).Invoke(modelBuilder, null);
                    MethodInfo methodInfo = entityConfig.GetType().GetMethods().Where(p => p.Name == "Property").ToList()[MethodNum];
                    decimalConfig = methodInfo.Invoke(entityConfig, new[] { lambdaExpression }) as DecimalPropertyConfiguration;
                }

                decimalConfig.HasPrecision(propAttr.attr.Precision, propAttr.attr.Scale);
            }
        }
    }
14
задан sharptooth 13 March 2009 в 06:18
поделиться

3 ответа

С ReadFile/WriteFile у Вас есть детерминированная семантика обработки ошибок. При использовании файлов с отображенной памятью ошибки возвращаются путем выдачи исключения.

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

при использовании ReadFile/WriteFile, можно использовать асинхронные варианты API, чтобы позволить Вам управлять этим поведением.

у Вас также есть более детерминированная производительность при использовании ReadFile, особенно если шаблон ввода-вывода предсказуем - ввод-вывод с отображенной памятью часто случаен, в то время как, поскольку ReadFile почти всегда последователен (так как чтения ReadFile в текущем положении файла и совершенствуют текущее положение файла).

13
ответ дан 1 December 2019 в 13:34
поделиться

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

Также, если когда-нибудь должен портировать Ваш код на другую платформу, Вы сделаете это намного легче и быстрее, если Вы не будете использовать отображение файла.

2
ответ дан 1 December 2019 в 13:34
поделиться

Большое преимущество отображения файлов в том, что оно не влияет на системный кеш. Если ваше приложение выполняет чрезмерное количество операций ввода-вывода с помощью ReadFile, ваш системный кеш будет расти, потребляя все больше и больше физической памяти. Если ваша ОС 32-разрядная и у вас намного больше 1 ГБ памяти, вам повезло, так как в 32-разрядной Windows размер системного кеша ограничен 1 ГБ. В противном случае системный кеш будет использовать всю доступную физическую память, и диспетчер памяти вскоре начнет очищать страницы от других процессов на диске, усиливая операции с диском, а не сокращая их. Эффект особенно заметен в 64-битной Windows, где размер кеша ограничен только доступной физической памятью. С другой стороны, отображение файлов не приводит к чрезмерному разрастанию системного кеша и, в то же время, не снижает производительность.

3
ответ дан 1 December 2019 в 13:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: