C# docker容器中的线程池不足
我第一次遇到这种问题。我正在一个容器中运行一个应用程序,其中包含一些托管服务(AspNet、Core C#8.0、Docker container Linux)。第一个服务在我的数据库中执行大数据接收。 我将解释这项服务:它只是启动,从网上下载,然后下载一个2gb的文件,里面有很多JSON。然后在数据库中逐个添加反序列化的每个JSON文件。 它的开始非常好,但在500000条记录开始变慢之后,并没有结束数据摄取。如果我跑C# docker容器中的线程池不足,c#,docker,asp.net-core,bulkinsert,system.text.json,C#,Docker,Asp.net Core,Bulkinsert,System.text.json,我第一次遇到这种问题。我正在一个容器中运行一个应用程序,其中包含一些托管服务(AspNet、Core C#8.0、Docker container Linux)。第一个服务在我的数据库中执行大数据接收。 我将解释这项服务:它只是启动,从网上下载,然后下载一个2gb的文件,里面有很多JSON。然后在数据库中逐个添加反序列化的每个JSON文件。 它的开始非常好,但在500000条记录开始变慢之后,并没有结束数据摄取。如果我跑 docker logs -f <container> 这是在
docker logs -f <container>
这是在数据库中进行插入的代码部分:
公共类存储库:IVURepository
{
专用只读ILogger\u记录器
public VURepository(ILogger<VURepository> logger)
{
_logger = logger;
}
public void MassiveImport(VMContext _context, ASoVu newVU)
{
_context.Vu.Add(newVU);
}
公共VURepository(ILogger记录器)
{
_记录器=记录器;
}
公共void MassiveImport(VMContext _context,ASoVu newVU)
{
_context.Vu.Add(newVU);
}
你能展示插入数据库的代码吗?以及在DI容器中注册数据库连接的东西你没有发布任何代码。500K是微小的数据-数据库使用TB的数据和数十亿条记录。它不是数据库或容器,你甚至不需要多个线程来高效解析和导入文件如果我不得不猜测的话,我会说这是低效代码和糟糕的表设计的结合:在内存中解析整个文件,而不是使用流,例如,可能是逐行解析(RBAR)插入而不是使用数据库的大容量导入机制。可能并发性不好-由于冲突,有100个线程尝试插入数据并不能将速度提高100。保存/导入取决于场景。一种方法,尤其是对于较小的文件(MB),将使用Json.NET的反序列化程序解析数据,并使用SqlBulkCopy或数据库产品提供的任何内容在SQL Server中大容量导入数据。对于较大的文件,反序列化所有内容都会损害性能,应使用JsonReader以类似SAX的方式读取元素。SqlBulkCopyPS:Reposito也会使用这些记录ry
和MassiveImport
是相互矛盾的术语。您不需要(实际上甚至不应该考虑使用)大容量导入场景中的存储库。该域中没有对象、实体或关系。它是行、转换、源和目标。ORM不使用大容量导入机制,因此它们的INSERT语句已经慢得多。尽管发布的代码将整个数据集缓存多次—作为完整字符串,作为已解析的JsonDocument,作为单个实体。对于2GB文件,至少6GB的浪费RAMJsonDocument
是一次性的。您需要使用var jsonDoc=JsonDocument.Parse(jsonFull)通过处理它;
语句。您似乎根本没有使用jsonParsed
,但如果是,则需要将其使用限制在文档的using
范围内,或者克隆它。
foreach (string filename in filesnumber)
{
using (StreamReader r = new StreamReader(filename))
{
//Parsin JSON
aInt++;
string jsonFull = r.ReadToEnd();
JsonDocument jsonDoc = JsonDocument.Parse(jsonFull);
JsonElement jsonParsed = jsonDoc.RootElement;
ASoVu newVU = new ASoVu();
newVU = _importStrategy.VU();
_repository.MassiveImportNVD(_context, newVUL)
if (aInt == 9999)
{
_repository.Save(_context);
}
}
}
public VURepository(ILogger<VURepository> logger)
{
_logger = logger;
}
public void MassiveImport(VMContext _context, ASoVu newVU)
{
_context.Vu.Add(newVU);
}