一个超级大的文件如何更快读

一个,超级,文件,如何,更快 · 浏览次数 : 3189

小编点评

**方案一:使用多线程读取TSV文件** **步骤:** 1. 创建一个生产者任务,读取TSV文件并将其写入数据库。 2. 创建4个消费者任务,从队列中读取数据并将其写入数据库。 3. 使用Task Parallel Library (TPL)实现多线程。 **代码示例:** ```csharp using System; using System.IO; using System.Threading.Tasks; using System.Data.SqlClient; static void Main() { string path = @"yourFile.tsv"; ConcurrentQueue<string[]> queue = new ConcurrentQueue<string[]>(); // 生产者任务 var producer = Task.Run(() => { using (var reader = new StreamReader(path)) { string line; while ((line = reader.ReadLine()) != null) { var fields = line.Split('\\t'); queue.Enqueue(fields); } } }); // 消费者任务 var consumers = new Task[4]; for (int i = 0; i < consumers.Length; i++) { consumers[i] = Task.Run(() => { string connString = "Your connection string"; using (var conn = new SqlConnection(connString)) { conn.Open(); while (true) { if (queue.TryDequeue(out string[] fields)) { using (var cmd = new SqlCommand("Your insert command", conn)) { // Update parameters in cmd using fields cmd.ExecuteNonQuery(); } } else if (producer.IsCompleted) { break; } } } }); } // 等待所有任务完成 Task.WaitAll(consumers); } ``` **讨论:** 1. **使用偏移值去分多个任务读:**可以利用偏移值来指定读取的起始位置和结束位置。但是,如果文件数据按每个换行符去分割数据,则偏移值可能不是每一行的开头。 2. **解决偏移值问题:**可以使用以下方法解决偏移值问题: - 将所有偏移值存储在数据库中,并按顺序读取文件。 - 在读取文件之前,使用偏移值从数据库中获取实际数据长度。 - 当读取到指定位置时,从队列中取出数据并将其写入数据库。 **其他建议:** - 使用缓存机制以减少读取文件中的重复数据。 - 使用异步操作以提高性能。 - 监控并优化应用程序性能。

正文

一个超级大的文件如何更快读

问题起因

一个有千万的数据的txt文件如何发挥IO的全部性能更快的读和写。

方案一

使用ChatGPT4的方案

在C#中,我们可以使用多线程来处理大量的数据并将其写入数据库。在处理大数据时,我们需要将任务分解为多个子任务,这样我们可以在不同的线程中并行执行它们以提高性能。

这里是一种可能的解决方案,使用了Task Parallel Library (TPL)来实现多线程。假设我们使用的是SQL Server数据库,并且我们正在处理的文件是TSV(Tab-Separated Values)文件。

using System;
using System.IO;
using System.Threading.Tasks;
using System.Data.SqlClient;
using System.Collections.Concurrent;

class Program
{
    static void Main()
    {
        string path = "yourFile.tsv";
        ConcurrentQueue<string[]> queue = new ConcurrentQueue<string[]>();

        var producer = Task.Run(() =>
        {
            using (var reader = new StreamReader(path))
            {
                string line;
                while ((line = reader.ReadLine()) != null)
                {
                    var fields = line.Split('\t');
                    queue.Enqueue(fields);
                }
            }
        });

        var consumers = new Task[4];
        for (int i = 0; i < consumers.Length; i++)
        {
            consumers[i] = Task.Run(() =>
            {
                string connString = "Your connection string";
                using (var conn = new SqlConnection(connString))
                {
                    conn.Open();
                    while (true)
                    {
                        if (queue.TryDequeue(out string[] fields))
                        {
                            using (var cmd = new SqlCommand("Your insert command", conn))
                            {
                                // Update parameters in cmd using fields
                                cmd.ExecuteNonQuery();
                            }
                        }
                        else if (producer.IsCompleted)
                        {
                            break;
                        }
                    }
                }
            });
        }

        Task.WaitAll(consumers);
    }
}

在上面的代码中,我们首先创建了一个生产者任务,该任务从TSV文件中读取每一行,然后将每一行分割为字段,并将结果存入队列。然后我们创建了4个消费者任务,每个消费者任务都从队列中

题外话题

如果这个文件是按照行去分割数据如何利用多线程去发挥更高性能?

讨论 采用偏移值去分多个任务读,并且需要解决偏移值不一定还在每一行中的位置,使用需要设计好如何解决偏移值的位置问题。

首先规定任务的偏移值提供案例:

[
	{
	"start":0,
	"end":10000
	},
	{
	"start":10001,
	"end":20000
	},
	{
	"start":20001,
	"end":30000
	},
	{
	"start":30000,
	"end":40000
	}
]

在这里提供了四个任务,每一个任务的偏移值都是固定的,请注意,我们的文件的数据是按照每个换行符去分割数据,如果使用了偏移值,我们无法保证偏移值的位置一定是每一行的开头,这个时候需要注意如何处理偏移值的问题,下面我提供一个简单的解决方法,采用伪代码

var data = new object []{
   
	{
	"start":0,
	"end":10000
	},
	{
	"start":10001,
	"end":20000
	},
	{
	"start":20001,
	"end":30000
	},
	{
	"start":30000,
	"end":40000
	}
}

// 处理偏移值的方法

// 提供多个线程任务去并发执行读

通过伪代码我们可以看到,解决偏移值的问题是由先提供一个方法,将每一个偏移值去先处理一边在去执行任务。这样就可以解决问题。

这个属于题外话题。如果大佬们有其他想法也可以讨论,话题不在意IO的瓶颈,如何更快的读

与一个超级大的文件如何更快读相似的内容:

一个超级大的文件如何更快读

# 一个超级大的文件如何更快读 问题起因 ![](https://img2023.cnblogs.com/blog/2415052/202306/2415052-20230608110517159-989018809.png) 一个有千万的数据的txt文件如何发挥IO的全部性能更快的读和写。 ##

MySQL基础知识(二)-超详细 Linux安装MySQL5.7完整版教程及遇到的坑

1.简介 我们经常会在Linux上安装MySQL数据库,但是安装的时候总是会这里错,那里错,不顺利,今天整理了一下安装流程,连续安装来了两遍,没有遇到什么大错误,基本上十分钟左右可以搞定,教程如下。写着一篇文章主要是答应别人要帮忙给他在Linux上安装一下mysql(MySQL是5.7,Linux是

2023年最新版Apollo保姆级使用手册(超级详尽版本)

目录Apollo操作说明前言Apollo环境部署一、环境构建二、官方地址三、数据库脚本使用四、配置Apollo文件五、启动Apollo六、访问ApolloApollo产品使用一、修改部门二、应用操作三、用户操作四、系统权限管理1、创建应用权限配置2、创建应用权限配置3、与旧版比对五、系统参数1、Po

一文搞懂Maven配置,从此不再糊涂下载依赖(文末有成品)

一般来说Maven都是配合着idea一起使用,下载依赖速度慢就去网上找个镜像配置一下,但总会遇到莫名其妙的问题,比如镜像源不生效、Error reading file pom.xml等等。今天详细讲解一下maven配置文件settings.xml的配置方法。 小知识 maven的配置文件存在于两个地

[转帖]Redis配置项汇总(超级详细)

http://c.biancheng.net/redis/config-summary.html 本节对 Redis 的常用配置项和基本命令做简单的总结,您可以把本篇文章看做简版的速查手册。不过,需要注意的是由于 Redis 不同版本的差异,配置项会多少存在一些不同,但总体的来说,大同小异。 基本配

17岁中专女生勇夺2024阿里全球数学赛12名好成绩,今天,站在程序员的视角,我们来聊聊数学对编程的价值与意义...

大家好,我是程序员陶朱公,一个认真生活,总想超越自己的程序员。 前言 相信这两天,大家都刷屏到了一个比较热度的新闻——17岁中专女生在今年这届阿里举办的全球数赛中,勇夺第12名的好成绩。 ↓↓↓ 看到这里,可能有小伙伴会觉得有点疑惑:又不是第一名,不明白第12名的她,为什么会引起社会这么大的一个反响

基于毫米波雷达的手势识别算法

摘要 基于毫米波的手势识别技术提供了良好的人机交互体验。先前的工作专注于近距离手势识别,但在范围扩展方面不够,即他们无法识别距离相当大的噪声运动超过一米的手势。在本文中,我们利用一种新的数据处理方法和定制的人工卷积神经网络(CNN)设计了一个远程手势识别模型。首先,我们将手势分解为多个反射点,并提取

物理学又不存在了?ChatGPT:室温超导是物理学的一个梦想

大家好,我是小彭。 就在前天,一组微信聊天记录突然开始在各大群中流传: 随后,这一新闻直接引爆各大社交媒体,物理学又双叒叕不存在了吗? 到底是什么重磅消息呢? 原来在美国物理学会的三月会议上,美国纽约罗切斯特大学的 Ranga Dias 团队发布了一项研究成果 —— 他们发现了能够在室温环境下实现超

万物皆可集成系列:低代码对接阿里物流API实现快递跟踪

随着各大电商网购平台的发展,快递业已形成一个规模庞大的产业,据统计,全球快递企业已超过千家,而快递查询对于电商平台而言是最基础的功能之一,通过输入快递单号,不用区分具体是哪家快递公司,即可查询到快递的实时状态。目前的主流方法都是调用第三方快递查询接口,下面就介绍一下在活字格中如何调用API接口来进行

基于Spring-AOP的自定义分片工具

作者:陈昌浩 1 背景 随着数据量的增长,发现系统在与其他系统交互时,批量接口会出现超时现象,发现原批量接口在实现时,没有做分片处理,当数据过大时或超过其他系统阈值时,就会出现错误。由于与其他系统交互比较多,一个一个接口做分片优化,改动量较大,所以考虑通过AOP解决此问题。 2 Spring-AOP