首页 > 编程语言 >C# serialize big collection via NewtonSoft.Json

C# serialize big collection via NewtonSoft.Json

时间:2024-10-31 23:21:40浏览次数:1  
标签:via C# big System static BooksList ToString using new

System.OutOfMemoryException
  HResult=0x8007000E
  Message=Exception of type 'System.OutOfMemoryException' was thrown.
  Source=mscorlib
  StackTrace:
   at System.Text.StringBuilder.ToString()
   at System.IO.StringWriter.ToString()
   at Newtonsoft.Json.JsonConvert.SerializeObjectInternal(Object value, Type type, JsonSerializer jsonSerializer)
   at Newtonsoft.Json.JsonConvert.SerializeObject(Object value, Formatting formatting)
   at ConsoleApp3.Program.TestBigDataSerialize() in D:\C\ConsoleApp3\ConsoleApp3\Program.cs:line 63
   at ConsoleApp3.Program.Main(String[] args) in D:\C\ConsoleApp3\ConsoleApp3\Program.cs:line 29

 

 

The solution is extend stream

public static class BigDataSerializeStream
{
    public static void WriteJsonToStream<T>(this Stream stream,IEnumerable<T> items)
    {
        using(var streamWriter=new StreamWriter(stream))
        {
            using(var jsonWriter=new JsonTextWriter(streamWriter))
            {  
                var serializer = new JsonSerializer();
                serializer.Formatting = Formatting.Indented;
                serializer.Serialize(streamWriter, items);
            }
        }
    }
}


static void SerializeBigDataViaStream()
{
    BooksList = new List<Book>();
    for (int i = 0; i < 5000000; i++)
    {
        BooksList.Add(new Book()
        {
            Id = i + 1,
            ISBN = $"ISBN_{Guid.NewGuid().ToString("N")}",
            Name = $"Name_{i + 1}",
            Title = $"Title_{i + 1}",
            Topic = $"Topic_{i + 1}"
        });
    }

    string jsonFile = $"{DateTime.Now.ToString("yyyyMMddHHmmssffff")}_{Guid.NewGuid().ToString("N")}.json";
    using(FileStream fs=File.Create(jsonFile))
    {
        fs.WriteJsonToStream<Book> (BooksList);
        MessageBox.Show($"Serialized {BooksList.Count} items!");
    }
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text; 
using Newtonsoft.Json;
using System.IO;
using System.Runtime.CompilerServices;
using System.Text;
using System.Windows;
using System.Threading;

namespace ConsoleApp3
{
    internal class Program
    {
        static void Main(string[] args)
        {
            AlarmDelEvent += Program_AlarmDelEvent;
            Thread td = new Thread(() =>
            {
                System.Timers.Timer tmr = new System.Timers.Timer();
                tmr.Interval = 1000;
                tmr.Elapsed += Tmr_Elapsed;
                tmr.Start();
            });
            td.Start();
            //BigDataSerializeRegular();
            SerializeBigDataViaStream();
            Console.ReadLine();
        }

        private static void Tmr_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            var procMem = System.Diagnostics.Process.GetCurrentProcess().WorkingSet64;
            Console.WriteLine(procMem.ToString());
            if (procMem > 4000000000)
            {
                AlarmDelEvent?.Invoke(procMem);
            }
        }

        public static List<Book> BooksList { get; set; }

        delegate void AlarmDel(double d);
        static event AlarmDel AlarmDelEvent;
        static void BigDataSerializeRegular()
        { 
            BooksList = new List<Book>();
            for (int i = 0; i < 5000000; i++)
            {
                BooksList.Add(new Book()
                {
                    Id = i + 1,
                    ISBN = $"ISBN_{Guid.NewGuid().ToString("N")}",
                    Name = $"Name_{i + 1}",
                    Title = $"Title_{i + 1}",
                    Topic = $"Topic_{i + 1}"
                });
            }

            string jsonStr = JsonConvert.SerializeObject(BooksList, Newtonsoft.Json.Formatting.Indented);
            string jsonFile = $"{DateTime.Now.ToString("yyyyMMddHHmmssffff")}_{Guid.NewGuid().ToString("N")}.json";
            using (StreamWriter writer = new StreamWriter(jsonFile, true, Encoding.UTF8))
            {
                writer.WriteLine(jsonStr);
                MessageBox.Show($"Saved {BooksList.Count()} in {jsonFile}");
            }
        }

        static void SerializeBigDataViaStream()
        {
            BooksList = new List<Book>();
            for (int i = 0; i < 15000000; i++)
            {
                BooksList.Add(new Book()
                {
                    Id = i + 1,
                    ISBN = $"ISBN_{Guid.NewGuid().ToString("N")}",
                    Name = $"Name_{i + 1}",
                    Title = $"Title_{i + 1}",
                    Topic = $"Topic_{i + 1}"
                });
            }

            string jsonFile = $"{DateTime.Now.ToString("yyyyMMddHHmmssffff")}_{Guid.NewGuid().ToString("N")}.json";
            using(FileStream fs=File.Create(jsonFile))
            {
                fs.WriteJsonToStream<Book> (BooksList);
                MessageBox.Show($"Serialized {BooksList.Count} items!");
            }
        }

        private static void Program_AlarmDelEvent(double d)
        {
            MessageBox.Show($"Over memory:{d}\n");
        }
    }

    public class Book
    {
        public int Id { get; set; }
        public string ISBN { get; set; }
        public string Name { get; set; }
        public string Title { get; set; }
        public string Topic { get; set; }

    }

    public static class BigDataSerializeStream
    {
        public static void WriteJsonToStream<T>(this Stream stream,IEnumerable<T> items)
        {
            using(var streamWriter=new StreamWriter(stream))
            {
                using(var jsonWriter=new JsonTextWriter(streamWriter))
                {  
                    var serializer = new JsonSerializer();
                    serializer.Formatting = Formatting.Indented;
                    serializer.Serialize(streamWriter, items);
                }
            }
        }
    }
       
}

 

标签:via,C#,big,System,static,BooksList,ToString,using,new
From: https://www.cnblogs.com/Fred1987/p/18519137

相关文章

  • 10_31_cf训练
    10.31_CF_刷题B.KarSalesman思路一个顾客一种型号的车只能买一个,所以\(a_i\)号车需要\(a_i\)个顾客,所以至少需要\(max(a_i)\)个顾客,把所有车买完至少\(\frac{sum}{x}\)个顾客,所以取两者最大值就好也就是说,先用比较少的去消耗比较多的,避免最后只剩下比较多的那种车如果最多......
  • 后台业务系统OA,CRM,ERP,HR这类开发用什么前端UI框架更好
    在开发后台业务系统如OA、CRM、ERP和HR时,选择合适的前端UI框架至关重要。本文主要探讨:一、Bootstrap框架;二、AntDesign框架;三、ElementUI框架;四、Vue.js框架;五、React框架。考虑到这些系统的复杂性和对界面的要求,以下框架能够提供高效、统一和用户友好的体验。一、Bootstrap......
  • C++《list》
    在本篇当中我们将学习STL中的list,在此list就是我们之前在数据结构学习过的链表,在本篇中我们要来了解list当中的成员函数该如何使用,由于list各个函数的接口和之前学习过的vector类型,因此在学习list的使用就较为轻松。在lis篇章中我们要重点了解的是在下一个篇章当中的list模拟实......
  • nextjs 实战开发1 Mercury 二级域名分发系统| 曲速引擎 Warp Drive
    开发目标开发一个免费的二级域名分发系统创建项目root@ubuntu:~/dev-nextjs/mercury_frontend#pnpmcreatenext-app@latest.版本:pnpm-v9.12.2版本:node-vv20.16.0版本:next15.0.2为了开发方便,我们要将脚手架的package.json进行修改,nextdev-H0.0.0.0-p80,这样当我们运......
  • yarn安装报错 Unrecognized option: --version Error: Could not create the Java Vir
    在自己电脑上安装yarn报错,Unrecognizedoption:--versionError:CouldnotcreatetheJavaVirtualMachine.Error:Afatalexceptionhasoccurred.Programwillexit.估计是和之前安装的hadoop冲突了使用whereyarn命令,找到安装yarn的目录C:\ProgramFiles\nodejs把......
  • [ACTF2020 新生赛]Exec
    题目链接:https://buuoj.cn/challenges#[ACTF2020新生赛]Exec。打开后,环境如下。尝试输入"127.0.0.1",抓取请求包。POST/HTTP/1.1Host:038dc28f-5191-4958-8946-1127f62ad770.node5.buuoj.cn:81Content-Length:16Cache-Control:max-age=0Upgrade-Insecure-Requests:......
  • [GXYCTF2019]Ping Ping Ping
    题目链接:https://buuoj.cn/challenges#[GXYCTF2019]PingPingPing打开环境后如下所示。题目直接提示了有一个GET参数,参数名是"ip",尝试输入:?ip=127.0.0.1后,结果如下所示。可以看到,网站后端进行了一个ping操作,猜测参数:ip可能存在命令注入漏洞。尝试输入:ip=;id,发现可以......
  • R语言贝叶斯分层、层次Hierarchical Bayesian模型的房价数据空间分析
    原文链接:https://tecdat.cn/?p=38077原文出处:拓端数据部落公众号本文主要探讨了贝叶斯分层模型在分析区域数据方面的应用,以房价数据为例,详细阐述了如何利用R帮助客户进行模型拟合、分析及结果解读,展示了该方法在处理空间相关数据时的灵活性和有效性。一、贝叶斯分层模型概述贝......
  • [SUCTF 2019]EasySQL
    题目链接:https://buuoj.cn/challenges#[SUCTF2019]EasySQL打开环境后,如下所示。尝试输入字符:1。尝试输入字符:0后,发现没有输出结果。尝试输入字符串"aaa"、"bbb"等后,发现都跟输入0的结果一致,而输入123、456等非0的内容,都与输入1一致,这里可以猜测(实际上需要比较......
  • R 语言中的 prcomp 和 princomp 有什么区别
    在R语言的统计和数据分析中,prcomp和princomp是用于主成分分析(PCA)的两个常用函数。这篇文章将深入探讨这两个函数的区别,包括它们的计算方法、适用场景、输出结果的解读以及它们在实际应用中的优缺点。通过比较分析,读者将能够更好地理解何时使用prcomp,何时使用princomp,以及如何根据......