如何比较大文本文件?

2023-11-21

我有一个关于你对我的“技术”的看法的一般性问题。

有 2 个文本文件(file_1 and file_2)需要相互比较。两者都非常巨大(3-4 GB,每个从 30,000,000 到 45,000,000 行)。 我的想法是阅读几行(尽可能多)file_1到内存,然后将它们与all的行file_2。如果存在匹配,则两个文件中匹配的行应写入新文件。然后继续接下来的 1000 行file_1并将它们与all的行file_2直到我经历了file_1完全地。

但这对我来说实际上听起来非常非常耗时且复杂。 您能想到其他方法来比较这两个文件吗?

您认为比较需要多长时间? 对于我的程序来说,时间并不那么重要。我没有处理如此大文件的经验,因此我不知道这可能需要多长时间。不过,应该不会超过一天。 ;-) 但我担心我的技术可能会永远持续下去......

我刚刚想到的另一个问题是:你会读入内存多少行?越多越好?有没有办法在实际尝试之前确定可能的行数? 我想尽可能多地阅读(因为我认为这样更快),但我经常内存不足。

提前致谢。

EDIT我想我必须多解释一下我的问题。

目的不是要查看这两个文件总体上是否相同(它们不是)。 每个文件中都有一些行具有相同的“特征”。 这是一个例子:file_1看起来有点像这样:

mat1 1000 2000 TEXT      //this means the range is from 1000 - 2000
mat1 2040 2050 TEXT
mat3 10000 10010 TEXT
mat2 20 500 TEXT

file_2看起来像这样:

mat3 10009 TEXT
mat3 200 TEXT
mat1 999 TEXT

TEXT指的是我不感兴趣的字符和数字,mat可以从mat1 - mat50并且没有顺序;也可以有1000xmat2(但下一列中的数字不同)。我需要以这样的方式找到拟合线: matX 在两条比较线和中提到的数字相同file_2符合中提到的范围file_1。 所以在我的例子中我会找到一个匹配项:第 3 行file_1和第 1 行file_2(因为都是mat3并且10009在10000到10010之间)。 我希望这能让你清楚!

所以我的问题是:你将如何搜索匹配的行?

是的,我使用 Java 作为我的编程语言。

EDIT我现在先划分大文件,这样就不会出现内存不足的问题。我还认为比较(许多)较小的文件比这两个大文件更快。之后我可以按照我上面提到的方式比较它们。这可能不是完美的方法,但我仍在学习;-) 尽管如此,您的所有方法对我都非常有帮助,谢谢您的回复!


我觉得,你的做法还是比较合理的。

我可以想象不同的策略 - 例如,您可以在比较之前对两个文件进行排序(文件排序的有效实现,unix排序实用程序可以在几分钟内对几个Gbs文件进行排序),并且在排序时,您可以按顺序比较文件,读取逐行。

但这是相当复杂的方法 - 您需要运行外部程序(排序),或者自己在 java 中编写文件排序的相当有效的实现 - 这本身并不是一件容易的任务。因此,为了简单起见,我认为分块读取的方式非常有前途;

至于如何找到合理的区块——首先,“越多越好”可能并不正确——我认为,所有工作的时间都会渐近增长,到某个恒定的线。所以,也许你会比你想象的更快地接近那条线——你需要为此制定基准。

接下来——您可以像这样读取要缓冲的行:

final List<String> lines = new ArrayList<>();
try{
    final List<String> block = new ArrayList<>(BLOCK_SIZE);
    for(int i=0;i<BLOCK_SIZE;i++){
       final String line = ...;//read line from file
       block.add(line);
    }
    lines.addAll(block); 
}catch(OutOfMemory ooe){
    //break
}

因此,您可以读取尽可能多的行——留下最后一个 BLOCK_SIZE 可用内存。 BLOCK_SIZE 应该足够大,以便其他程序能够在没有 OOM 的情况下运行

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何比较大文本文件? 的相关文章

  • Spring Batch 多线程 - 如何使每个线程读取唯一的记录?

    这个问题在很多论坛上都被问过很多次了 但我没有看到适合我的答案 我正在尝试在我的 Spring Batch 实现中实现多线程步骤 有一个包含 100k 条记录的临时表 想要在 10 个线程中处理它 每个线程的提交间隔为 300 因此在任何时
  • 为什么 i++ 不是原子的?

    Why is i Java 中不是原子的 为了更深入地了解 Java 我尝试计算线程中循环的执行频率 所以我用了一个 private static int total 0 在主课中 我有两个线程 主题 1 打印System out prin
  • Java JDBC:更改表

    我希望对此表进行以下修改 添加 状态列 varchar 20 日期列 时间戳 我不确定该怎么做 String createTable Create table aircraft aircraftNumber int airLineCompa
  • 在 HTTPResponse Android 中跟踪重定向

    我需要遵循 HTTPost 给我的重定向 当我发出 HTTP post 并尝试读取响应时 我得到重定向页面 html 我怎样才能解决这个问题 代码 public void parseDoc final HttpParams params n
  • 制作一个交互式Windows服务

    我希望我的 Java 应用程序成为交互式 Windows 服务 用户登录时具有 GUI 的 Windows 服务 我搜索了这个 我发现这样做的方法是有两个程序 第一个是服务 第二个是 GUI 程序并使它们进行通信 服务将从 GUI 程序获取
  • Final字段的线程安全

    假设我有一个 JavaBeanUser这是从另一个线程更新的 如下所示 public class A private final User user public A User user this user user public void
  • JAXb、Hibernate 和 beans

    目前我正在开发一个使用 Spring Web 服务 hibernate 和 JAXb 的项目 1 我已经使用IDE hibernate代码生成 生成了hibernate bean 2 另外 我已经使用maven编译器生成了jaxb bean
  • 无法展开 RemoteViews - 错误通知

    最近 我收到越来越多的用户收到 RemoteServiceException 错误的报告 我每次给出的堆栈跟踪如下 android app RemoteServiceException Bad notification posted fro
  • 反射找不到对象子类型

    我试图通过使用反射来获取包中的所有类 当我使用具体类的代码 本例中为 A 时 它可以工作并打印子类信息 B 扩展 A 因此它打印 B 信息 但是当我将它与对象类一起使用时 它不起作用 我该如何修复它 这段代码的工作原理 Reflection
  • 操作错误不会显示在 JSP 上

    我尝试在 Action 类中添加操作错误并将其打印在 JSP 页面上 当发生异常时 它将进入 catch 块并在控制台中打印 插入异常时出错 请联系管理员 在 catch 块中 我添加了它addActionError 我尝试在jsp页面中打
  • 路径中 File.separator 和斜杠之间的区别

    使用有什么区别File separator和一个正常的 在 Java 路径字符串中 与双反斜杠相反 平台独立性似乎不是原因 因为两个版本都可以在 Windows 和 Unix 下运行 public class SlashTest Test
  • Mockito when().thenReturn 不必要地调用该方法

    我正在研究继承的代码 我编写了一个应该捕获 NullPointerException 的测试 因为它试图从 null 对象调用方法 Test expected NullPointerException class public void c
  • 禁止的软件包名称:java

    我尝试从数据库名称为 jaane 用户名 Hello 和密码 hello 获取数据 错误 java lang SecurityException Prohibited package name java at java lang Class
  • 我可以使用 mod_rewrite 更改文件扩展名吗?例如 .jpeg 到 .jpg

    我希望使用 Apache mod rewrite 将文件提供为 jpg 而不是 jpeg 这可能吗 尝试这个 RewriteEngine on RewriteRule jpeg 1 jpg
  • 总是使用 Final?

    我读过 将某些东西做成最终的 然后在循环中使用它会带来更好的性能 但这对一切都有好处吗 我有很多地方没有循环 但我将 Final 添加到局部变量中 它会使速度变慢还是仍然很好 还有一些地方我有一个全局变量final 例如android Pa
  • 无法捆绑适用于 Mac 的 Java 应用程序 1.8

    我正在尝试将我的 Java 应用程序导出到 Mac 该应用程序基于编译器合规级别 1 7 我尝试了不同的方法来捆绑应用程序 1 日食 我可以用来在 Eclipse 上导出的最新 JVM 版本是 1 6 2 马文 看来Maven上也存在同样的
  • 如何从指定日期获取上周五的日期? [复制]

    这个问题在这里已经有答案了 如何找出上一个 上一个 星期五 或指定日期的任何其他日期的日期 public getDateOnDay Date date String dayName 我不会给出答案 先自己尝试一下 但是 也许这些提示可以帮助
  • 玩!框架:运行“h2-browser”可以运行,但网页不可用

    当我运行命令时activator h2 browser它会使用以下 url 打开浏览器 192 168 1 17 8082 但我得到 使用 Chrome 此网页无法使用 奇怪的是它以前确实有效 从那时起我唯一改变的是JAVA OPTS以启用
  • 编译器抱怨“缺少返回语句”,即使不可能达到缺少返回语句的条件

    在下面的方法中 编译器抱怨缺少退货声明即使该方法只有一条路径 并且它包含一个return陈述 抑制错误需要另一个return陈述 public int foo if true return 5 鉴于Java编译器可以识别无限循环 https
  • 有没有办法为Java的字符集名称添加别名

    我收到一个异常 埋藏在第 3 方库中 消息如下 java io UnsupportedEncodingException BIG 5 我认为发生这种情况是因为 Java 没有定义这个名称java nio charset Charset Ch

随机推荐

  • NSMetadataQuery 忽略自定义文件包类型

    我在用着UIManagedDocument管理我在 iCloud 中的文件 设置完后NSMetadataQuery像这样 iCloudQuery NSMetadataQuery alloc init iCloudQuery setSearc
  • 如何检查用户是否将“input”或“raw_input”提示留空?

    如何检查输入是否已输入 例如 python2 x str raw input Message gt gt 或者 python3 y input Number gt gt 你知道如果第二个没有输入任何内容 因为它会引发SyntaxError
  • Angularjs - 处理整个应用程序的 401

    我的一个控制器中有以下代码来优雅地处理 401 ChannelsService query function response scope channels response function error if error status 4
  • iOS 5 NSURL连接到HTTPS服务器

    我已经搜索了几个小时有关NSURLConnection允许我用来连接到任何 HTTPS 服务器的委托 方法 即使我在这个网站上搜索 我也找到了答案 但这些答案对我不起作用 如果你们需要的话 我会上传代码链接 但我更喜欢一个简单的教程 示例代
  • 改变WPF按钮的形状而不改变其他样式

    我想将 WPF 按钮的形状从默认的圆角矩形更改为其他形状 例如箭头 但我想保留其余的样式 填充颜色 边框颜色 悬停状态等 希望按钮与所有其他常规按钮具有相同的样式 我相信这取决于 Windows 版本 系统主题颜色等 所以我不能从头开始重新
  • 当作为带有接口约束的泛型参数传递时,值类型是否被装箱?

    As a result of doing the research to answer this question I think I have determined that the answer is no However I had
  • 为什么十六进制颜色值中有一个前导“#FF”?

    我在用着表达混合3 并手动编写一些 XAML 特别是控件的颜色值 我有一个已转换为十六进制的 RGB 颜色列表 我只需要将十六进制值插入到我的 XAML 中 最初 我将电子邮件中的十六进制值粘贴到适当的属性中 在我完成之前 Blend 开始
  • 绑定到 Xamarin Forms 中的附加属性

    如何绑定到 Xamarin Forms XAML 中的附加属性 这不起作用 但它可以编译并且最有意义 BindingContext x Binding Source x Reference ControlName Path XMLNameS
  • Zend 框架清除缓存

    我正在使用此代码在 zend 框架中缓存数组 frontendOptions array lifetime gt 24 3600 7 cache lifetime of 7 day automatic serialization gt tr
  • 绘制对数分类网络度分布

    我经常遇到并从复杂网络中制作长尾度分布 直方图 如下图所示 从许多观察来看 它们使这些尾巴的末端很重 非常重和拥挤 然而 我读过的许多出版物都有更清晰的度分布 在分布末尾没有这种聚集 并且观察结果的间隔更均匀 如何使用以下方法制作这样的图表
  • Topshelf 窗口服务在尝试启动服务时出现错误 1053

    我使用 Topshelf 开发了一个 Windows 服务 它在本地运行良好 当我部署测试并尝试启动服务时 出现以下错误 Error 1053 The service did not respond to the start or cont
  • Bash:循环遍历名称中包含模式的变量

    在我的脚本中 我有未知数量的包含角度的变量 我想将它们转换为向量 我创建了变量名称 使每个 参数 的角度具有以下形式 参数 角度 纬度 纬度 因此 每个参数都有一个 lat 和 perp 角度变量 所以我想做的是找到包含 angle lat
  • 如何在C++中获取动态数组的大小[重复]

    这个问题在这里已经有答案了 通过输入大小并将其存储到 n 变量中来编写动态数组的代码 但我想从模板方法获取数组长度而不是使用 n int a NULL Pointer to int initialize to nothing int n S
  • ASP.Net:在 Page_Load 中调用异步方法

    我有一个 API 客户端 它有一个发送方法 用于将我的对象发布到 Web API 服务并返回 ReturnedResults 类型的对象 现在我需要在 ASP net page load 事件中运行此 post 方法 我在这里看到了类似的示
  • 保护图片下载

    我知道保护图像下载的最佳方法首先就是不要将其放在互联网上 我认为没有 100 的防止图像下载的保护 如果用户可以在互联网上看到图像 他可以通过一些经验找到下载它的权限 我知道透明 gif or png覆盖图像或使用background im
  • 为什么macos(x86)可以运行docker arm容器arm64v8/alpine?

    我碰巧发现我的macos x86 可以为arm镜像arm64v8 alpine运行docker容器 但有以下警告 docker run it arm64v8 alpine uname a WARNING The requested imag
  • JavaFX完全定制windows?

    我想要一个完全自定义窗口外观的应用程序 到目前为止 我已经了解到可以使用以下方法删除典型的窗口内容 class Application extends javafx application Application Starts the ap
  • 通过 Eclipse Kepler 启动 tomcat v7 时遇到问题

    我看到像我这样的问题以前已经发布过 其中一些帖子已得到解答 我已经尝试过修复 看起来确实应该有效 但我仍然遇到同样的问题 我正在尝试通过本地主机上的 apache tomcat 7 0 53 在 Eclipse Kepler Java EE
  • 两个子图的单个颜色条会更改其中一个子图的大小

    我正在尝试添加一个colorbar两个人matshow主要使用以下代码here and here 我的代码现在如下 但问题是颜色条调节了右侧绘图的大小 我怎样才能防止这种情况发生 import numpy as np import matp
  • 如何比较大文本文件?

    我有一个关于你对我的 技术 的看法的一般性问题 有 2 个文本文件 file 1 and file 2 需要相互比较 两者都非常巨大 3 4 GB 每个从 30 000 000 到 45 000 000 行 我的想法是阅读几行 尽可能多 f