我目前正面临一个令人头疼的问题,我正在处理一个大型数据集(当我说大的时候,我的意思是数十亿行数据)而且我在速度和可扩展性之间陷入困境.
我可以在数据库中存储数十亿行数据,但是我的应用程序需要不断检查数据集中是否存在新的数据行,如果没有,则插入它,否则检索它.
如果我要使用数据库解决方案,我估计每次调用数据库以检索一行数据为10ms(乐观估计),我需要为我在我的应用程序中处理的每个文件检索大约800k记录,这意味着(10ms x 800k = 2.22 hours)每个要处理的文件.考虑到当数据库增长到数十亿和数十亿行时,从数据库中检索一行数据所需的时间量将增加,因此分析和处理1个文件的时间跨度太长.
我还想过存储一个List或者HashSet在本地内存中进行比较和检索,但它不会解决,因为我无法在内存中存储数十亿条记录(对象).
请告诉我应该为我的情况做些什么.
编辑:哦,是的,我忘了声明我已经实现了半缓存,一旦检索到一条记录,它就会被缓存在内存中,所以如果需要再次检索相同的记录,它将从内存相反,但我面临同样的问题,我将达到一个时间点,内存不再适合任何更多的缓存数据.
所以我目前正在使用一个使用Entity Framework的ASP.NET MVC Web应用程序,我也使用Ninject进行依赖注入.
所以基本上,目前,这是我用Ninject注册我的DbContext和服务的方式.
kernel.Bind<DbContext>().To<MyApplicationContext>().InSingletonScope();
kernel.Bind<IAccountService>().To<AccountService>().InSingletonScope();
kernel.Bind<IRegionService>().To<RegionService>().InSingletonScope();
kernel.Bind<IRoleService>().To<RoleService>().InSingletonScope();
Run Code Online (Sandbox Code Playgroud)
我注册它们InSingletonScope,这意味着它们只会被创建一次并在应用程序的整个生命周期中使用(至少我是如何理解的).
控制器:
private IAccountService _accountService;
public MemberController(IAccountService accountService)
{
_accountService = accountService;
}
Run Code Online (Sandbox Code Playgroud)
但是,我深深感到这个单例范围会导致我的Web应用程序出现问题,特别是对于Entity Framework的上下文,因为它是单例.
我已经面临一个小问题,如果我使用SQL Management Studio手动更新数据库,我的Web应用程序的实体框架中的数据将不会更新,直到我重新启动应用程序(似乎是EF中的一些缓存机制).
-
但是,如果我删除了InSingletonScope,我将随机从EF获取错误说:
IEntityChangeTracker的多个实例不能引用实体对象
我理解为什么会发生这种情况,因为初始化的DbContext AccountService可能与说不同RegionService.但我不知道如何解决这个问题.
我对依赖注入的理解仍然非常有限,所以有人可以建议吗?
-
编辑:我已经尝试改为InRequestScope所有注射,但我仍然得到
IEntityChangeTracker的多个实例不能引用实体对象
尝试从我的应用程序中的另一个服务插入具有相关对象(外键)的新实体时.这意味着他们仍在使用不同的DbContext,发生了什么?!
最后编辑:好的我发现了问题,这是我的缓存机制缓存了以前的请求,导致所有后续请求的关系问题.
c# asp.net-mvc entity-framework dependency-injection ninject
我目前正在研究PDF,但我正面临着试图增加a的行高的问题Paragraph,这是我现在的代码:
var tempTable = new PdfPTable(1);
cell = new PdfPCell(new Paragraph("My Account", GetInformationalTitle()));
cell.Border = Rectangle.NO_BORDER;
tempTable.AddCell(cell);
cell = new PdfPCell(new Paragraph("http://www.google.com/", GetInformationalOblique()));
cell.Border = Rectangle.NO_BORDER;
cell.PaddingBottom = 10f;
tempTable.AddCell(cell);
var para = new Paragraph("Login to 'My Account' to access detailed information about this order. " +
"You can also change your email address, payment settings, print invoices & much more.", GetInformationalContent());
para.SetLeading(0f, 2f);
cell = new PdfPCell(para);
cell.Border = Rectangle.NO_BORDER;
tempTable.AddCell(cell);
Run Code Online (Sandbox Code Playgroud)
正如你从上面所看到的,我正在尝试增加行高para,我已经尝试了para.SetLeading(0f, 2f)但它仍然没有增加行高或行距,因为它被称为. …