- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我一直面临着产生一种方法的挑战,该方法将非常大的文本文件读入程序,这些文件的范围从 2gb 到 100gb。
目前的想法是将大约 1000 行文本读入该方法。
目前程序是使用流读取器逐行读取文件并处理在该行找到的必要数据区域设置的。
using (StreamReader reader = new StreamReader("FileName"))
{
string nextline = reader.ReadLine();
string textline = null;
while (nextline != null)
{
textline = nextline;
Row rw = new Row();
var property = from matchID in xmldata
from matching in matchID.MyProperty
where matchID.ID == textline.Substring(0, 3).TrimEnd()
select matching;
string IDD = textline.Substring(0, 3).TrimEnd();
foreach (var field in property)
{
Field fl = new Field();
fl.Name = field.name;
fl.Data = textline.Substring(field.startByte - 1, field.length).TrimEnd();
fl.Order = order;
fl.Show = true;
order++;
rw.ID = IDD;
rw.AddField(fl);
}
rec.Rows.Add(rw);
nextline = reader.ReadLine();
if ((nextline == null) || (NewPack == nextline.Substring(0, 3).TrimEnd()))
{
d.ID = IDs.ToString();
d.Records.Add(rec);
IDs++;
DataList.Add(d.ID, d);
rec = new Record();
d = new Data();
}
}
}
程序继续进行并填充一个类。 (只是决定不发布其余部分)
我知道一旦程序显示一个非常大的文件,就会出现内存异常错误。
所以这是我当前的问题,到目前为止,我一直在谷歌搜索几种方法,许多人只是回答使用流阅读器和 reader.readtoend,我知道 readtoend 对我不起作用,因为我会遇到这些内存错误。
最后,我一直在研究异步,作为一种创建方法的方法,该方法将读取一定数量的行并在处理下一批行之前等待调用。
这让我想到了我的问题,我正在努力理解异步,而且我似乎找不到任何可以帮助我学习的 Material ,希望这里有人可以帮助我理解异步。
当然,如果有人知道解决这个问题的更好方法,我会洗耳恭听。
编辑 添加了剩余的代码以结束任何混淆。
最佳答案
您的问题不在于同步 v 的异步,而是您正在读取整个文件并将文件的部分内容存储在您对数据执行某些操作之前.
如果您读取每一行,对其进行处理并将结果写入另一个文件/数据库,那么 StreamReader
将允许您处理多 GB(或 TB)的文件。
只有当你存储文件的一部分直到你读完它才会有问题,然后你会遇到内存问题(但你会惊讶于你可以让 Lists
有多大& Dictionaries
在内存不足之前获取)
您需要做的是尽快保存处理后的数据,而不是将其保存在内存中(或尽可能少地保存在内存中)。
对于大文件,您可能需要将您的工作集(您的处理数据)保存在数据库中 - 可能像 SqlExpress 或 SqlLite 这样的东西会做(但同样,这取决于您的工作集有多大)。
希望这会有所帮助,请不要犹豫,在评论中提出更多问题,或编辑您的原始问题,如果我能以任何方式提供帮助,我会更新此答案。
更新 - 分页/分块
您需要以一页为单位读取文本文件,并允许用户滚动文件中的“页面”。当用户滚动时,您会阅读并向他们展示下一页。
现在,您可以做一些事情来帮助自己,始终在内存中保留大约 10 个页面,这可以让您的应用在用户快速向上/向下翻几页时做出响应。在应用程序空闲时间(Application Idle event)你可以读取接下来的几页,你再次丢弃当前页面之前或之后超过五页的页面。
向后翻页是个问题,因为您不知道文件中每一行的开始或结束位置,因此您不知道每一页的开始或结束位置。因此,对于向后分页,当您向下阅读文件时,保留每页开头的偏移量列表(Stream.Pos
),然后您可以快速Seek
到给定位置并从那里读取页面。
如果您需要允许用户搜索文件,那么您几乎可以逐行阅读文件(边走边记住页面偏移量)以查找文本,然后当您找到内容时,读入并阅读向他们展示该页面。
您可以通过将文件预处理到数据库中来加快一切速度,网格控件可以处理动态数据集(它们会为您进行分页),并且您可以获得内置搜索/过滤器的好处。
因此,从某些的角度来看,这是异步读取文件,但这是从用户的角度来看。但是从技术的角度来看,当我们谈论在编程时做一些异步的事情时,我们往往指的是别的东西。
关于c# - 读取非常大的文本文件,我应该合并异步吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15954029/
我遇到以下问题。我想读取一个包含数百万行和数百列的大型 csv。我想向下转换列的数据类型。我的方法是读取 csv,然后使用 pd.to_numeric() 对其进行向下转换。我不知道列数及其类型。在读
目前,我从 SQL server (2008) 数据库获取数据。 cyurrent的方法是使用DataTable,然后将其传递并使用。 if (parameters != null)
我有以下问题。我有一个巨大的 csv 文件,想用多处理加载它。对于一个包含 500000 行和 130 列不同数据类型的示例文件,Pandas 需要 19 秒。我试过 dask 因为我想多处理阅读。但
是否有关于用于序列化各种 MFC 数据结构的二进制格式的明确文档?我已经能够在十六进制编辑器中查看我自己的一些类,并使用 Java 的 ByteBuffer 类读取它们(使用自动字节顺序转换等)。 但
我正在使用 Selenium 进行测试,我们用 HTML 文件编写测试用例,并用它们制作测试套件,我们的要求是编写足够健壮的测试用例,以根据测试环境改变自身。 为此,我不希望在 HTML 脚本本身中包
我需要一个 JavaScript 代码来读取存储为 .txt 文件的字典(或者也可以保存为任何其他类型的文件。它也可以在线获得)并将其内容存储在一个变量中。我不能找到一种让 JavaScript 像
我正在尝试遍历包含 SSH 登录和其他日志的日志文本文件。 程序正在返回 SSH 登录的总数。 我的解决方案确实有效,但似乎有点慢(在 200mo 文件上大约需要 3.5 秒)。我想知道是否有任何方法
我正在将大量数据从一个电子表格复制到工作簿中的其他 160 个电子表格。目前,Excel (2013) 遇到错误,因为它没有足够的资源来完成操作。 我的目标是将工作表 4 中 V13:XI1150 范
我正在尝试读取一个有 1147 行的文本文件。下面的代码仅读取第 1050-1147 行。我的目标是读取整个文件并提取位于不同行的特定值以在脚本中使用。一个示例是包含“BlockList: 2”的行中
我正在为游戏编写解释器。用户将其移动输入解释器,程序执行该移动。 现在我想为每个决定实现一个时间限制。玩家不应该能够思考超过 30 秒来写一个移动并按下回车。 call_with_time_limit
以this file例如,我正在尝试读取 data.frame 中的数据。来自 the doc (pdf 文件,表 1),它遵循一些 fortran 约定。我尝试了以下但收效甚微: dir 0' 将
我正在使用 R 阅读 Outlook 附件。我的引用在这里:Download attachment from an outlook email using R 这是我的电子邮件的截图: 这每天都会发送
我不会从表格中读取行来将主题放在列表中 php脚本 $url_obj='http://'.$host.':8069/xmlrpc/object'; $sock=new xmlrpc_client($u
我有一个这样的 csv 文件: id,name,value 1,peter,5 2,peter\,paul,3 我如何读取此文件并告诉 R "\," 不表示新列,仅表示 ","。 我必须添加该文件
我正在尝试读取 ~/Library/Preferences/com.apple.mail.plist (在 Snow Leopard 上)以获取电子邮件地址和其他信息以进入“关于”对话框。我使用以下代
This question already has answers here: How do I use floating-point division in bash? (19个回答) 5个月前关闭
本练习的目标是读取输入文件并将其存储到表中,然后验证输入中的某些字段并输出任何错误记录。我需要读取并存储每个策略组,以便表中一次仅存储 5 条记录,而不是整个文件。 所以我需要读取一个包含 5 条记录
据我了解,LWT 插入始终以 SERIAL 一致性级别完成。如果为 true,这是否意味着读取作为 LWT 插入的行可以安全地以 ANY 的一致性级别读取? 换句话说,我假设 LWT 插入是完全一致的
我看到很多很多通过java脚本读取cookie的函数,但我只想在变量中使用它一次,我是JS新手。 这是我的代码 var TheNumber = (Math.random() + '') * 10000
我正在使用 asp.net 和 C#。我在服务器上部署了一个应用程序[已发布],现在我想查看该网站的代码,据我所知,我可以阅读程序集来查看代码。 请告诉我如何实现它。 提前致谢。 最佳答案 您可以使用
我是一名优秀的程序员,十分优秀!