使用多线程写入文件

2024-01-04

我正在尝试使用多个线程在 Java 中编写一个大文件。

我都尝试过FileWriter and bufferedWriterJava 中的类。

正在写入的内容实际上是使用读取的整个表(Postgres)CopyManager并写下。文件中的每一行都是表中的一个元组,我一次写入 100 行。

写法:

单个待写入文件由多个线程以追加模式打开。 此后每个线程尝试写入文件 file。

以下是我面临的问题:

  • 有时,文件的内容会被覆盖,即:一行仍然不完整,下一行从那里开始。我的假设是 writer 的缓冲区已满。这迫使写入者立即将数据写入文件。写入的数据可能不是完整的行,在写入剩余部分之前,下一个线程会将其内容写入文件。
  • 使用时Filewriter,有时我会在文件中看到一条黑线。

有什么建议,如何避免此数据完整性问题?


共享资源==争用

根据定义,写入普通文件是一个序列化操作。尝试从多个线程写入数据不会获得任何性能,I/O 是一种有限的有限资源,其带宽甚至比最慢或最过载的 CPU 还要小几个数量级。

对共享资源的并发访问可能很复杂(而且很慢)

如果您有多个线程正在执行昂贵的计算,那么您就有选择,如果您只是因为认为要加快速度而使用多个线程,那么您只会做相反的事情。 I/O 争用总是会减慢对资源的访问速度,但由于锁等待和其他开销,它永远不会加快速度。

您必须有一个受保护的关键部分,并且一次只允许一个写入者。只需查找支持并发的任何日志编写器的源代码,您就会发现只有一个线程写入文件。

如果您的应用主要是:

  1. CPU 限制:您可以使用某种锁定机制/数据构造来一次只让多个线程中的一个线程写入文件,从并发的角度来看,作为一种幼稚的解决方案,这将是无用的;如果这些线程受 CPU 限制且 I/O 很少,那么这可能会起作用。

  2. I/O 限制:这是最常见的情况,您必须使用带有某种队列的消息传递系统,并将所有线程发布到队列/缓冲区,并从其中提取单个线程并写入文件。这将是最具可扩展性和最容易实施的解决方案。

日志记录 - 异步写入

如果您需要创建一个超大文件,其中写入顺序并不重要并且程序受 CPU 限制,您可以使用日志技术。

各有process写入一个单独的文件,然后最后将多个文件连接成一个大文件。这是一所非常古老的学校low tech效果良好且已经使用了数十年的解决方案。

显然,您拥有的存储 I/O 越多,最终连接的性能就越好。

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

使用多线程写入文件 的相关文章

  • 从SQLite列中获取所有数字字符串并进行总和计算

    我是 Android 和 SQLite 的新手 我在 SQLite 中有一个只有数字的 AMOUNT 列 我可以在 ListView 中显示它 但我无法找到任何我理解的方法来将它们全部添加并显示在 TextView 中 这是数据库助手 im
  • selenium 2.0 中的 isElementPresent

    大家好 我正在使用 webdriver 所以如果我想使用 selenium s rc 函数 isElementPresent 我必须模拟 selenium rc 所以我会执行以下操作 import org openqa selenium B
  • 参考接口创建对象

    引用变量可以声明为类类型或接口类型 如果变量声明为接口类型 则它可以引用实现该接口的任何类的任何对象 根据上面的说法我做了一个理解上的代码 正如上面所说声明为接口类型 它可以引用实现该接口的任何类的任何对象 但在我的代码中显示display
  • 使用 POJO 仅更新 JOOQ 记录中已更改的字段

    我想使用 POJO 作为源来更新 JOOQ 记录中已更改的字段 Record from Object http www jooq org javadoc 3 8 x org jooq Record html from java lang O
  • Spark SQL 失败,因为“常量池已超过 JVM 限制 0xFFFF”

    我在 EMR 4 6 0 Spark 1 6 1 上运行此代码 val sqlContext SQLContext getOrCreate sc val inputRDD sqlContext read json input try inp
  • 使用 RMySQL 会干扰 RPostgreSQL

    我有一个 R 脚本 我想从 MySQL 数据库中提取一些数据 然后从 PostgreSQL 数据库中提取一些数据 但是 从 RMySQL 加载 MySQL 驱动程序会阻止我从以下位置加载 PostgreSQL 驱动程序 PostgreSQL
  • 对象映射器 - YAMLFactory - 由于缺少 _createContentReference 方法而出现异常

    我正在使用最新的 2 13 0 版本的 jackson 当我尝试解析 YAML 文件时 出现此异常 java lang NoSuchMethodError com fasterxml jackson core io ContentRefer
  • SwingUtilities.invokeLater

    我的问题与SwingUtilities invokeLater 我应该什么时候使用它 每次需要更新 GUI 组件时都必须使用吗 它到底有什么作用 是否有替代方案 因为它听起来不直观并且添加了看似不必要的代码 Do I have to use
  • @Transactional 注解属于哪里?

    如果您将 Transactional in the DAO类和 或其方法 或者注释使用 DAO 对象调用的服务类是否更好 或者注释两个 层 是否有意义 我认为事务属于服务层 它是了解工作单元和用例的人 如果您将多个 DAO 注入到需要在单个
  • Netty Nio java 中的通信

    我想在 Netty nio 中创建一个具有两个客户端和一个服务器的通信系统 更具体地说 首先 我希望当两个客户端与服务器连接时从服务器发送消息 然后能够在两个客户端之间交换数据 我正在使用本示例提供的代码 https github com
  • 从侦听器中修改 JFrame [重复]

    这个问题在这里已经有答案了 可能的重复 如何在框架可见后调用 setUndecorated https stackoverflow com questions 875132 how to call setundecorated after
  • Tomcat下的Spring CXF Soap Web服务:找不到服务

    我正在尝试使用 CXF 和 Spring 设置一个在 Tomcat 上运行的简单 CXF Web 服务 我有一个 Web 应用程序初始化程序来引导 CXF servlet public class WebAppInitializer ext
  • 尝试通过 Java 8 中的 JDBC-ODBC 连接到 .accdb 文件时出现 ClassNotFoundException

    我正在 Eclipse EE IDE 中的 Java 项目中工作 我必须在其中查询 accdb文件 问题是当我尝试加载驱动程序然后连接到数据库时 它给了我一个异常错误 My code try String filePath myfilepa
  • 可空日期列合并问题

    我在 Geronimo 应用程序服务器上使用 JPA 和下面的 openjpa 实现 我也在使用MySQL数据库 我在更新具有可为空 Date 属性的对象时遇到问题 当我尝试合并 Date 属性设置为 null 的实体时 不会生成 sql
  • Java环境变量设置方法

    我已将以下行插入 bash profile export GOOGLE APPLICATION CREDENTIALS Users jun Downloads export PATH PATH GOOGLE APPLICATION CRED
  • 隐藏 JTable 临时列

    我正在使用 JTable 显示数据库中的数据 现在我想通过 Jcombobox 过滤我的 jtable 我正在使用 Jcombo 框 其中包含 030 024 045 等值 这些值已在 jtable 中设置为列标题 当我单击组合时 选定的列
  • 在 Spark MLlib 上使用 Java 中的 Breeze

    在尝试从Java使用MLlib时 使用微风矩阵运算的正确方法是什么 例如scala 中的乘法很简单 matrix vector 相应的功能在Java中是如何表达的 有一些方法 例如 colon times 可以通过正确的方式调用 breez
  • com.fasterxml.jackson.databind.JsonMappingException:无法反序列化 org.springframework.data.domain.Sort 的实例 START_ARRAY 令牌

    我的 objectMapper 正在获取类型的值Page
  • 为什么我们不能在函数式接口中重载抽象方法? (爪哇)

    所以我熟悉java中的函数式接口 以及它们与lambda表达式的使用 一个函数式接口只能包含一个抽象方法 当从 lambda 表达式使用这一孤独方法时 您不需要指定其名称 因为接口中只有一个抽象方法 编译器知道这就是您正在引用的方法 Exa
  • RetentionPolicy CLASS 与 RUNTIME

    两者之间有什么实际区别RetentionPolicy CLASS and RetentionPolicy RUNTIME 看起来两者都被记录到字节码中 并且无论如何都可以在运行时访问 无论如何 两者都可以在运行时访问 那不是那个javado

随机推荐

  • 对二维点数组进行排序以找出四个角

    您好 我有任何大小的二维点的集合 通过查找原点之间距离的最小值和最大值 我能够找出左上角和右下角点 但我无法找出顶部 右点和左下点 也许你可以使用cv approxPoly 找到二维点集的角点 然后您可以通过以下方式按您想要的任何顺序对点进
  • hibernate用于动态表创建

    我是一个 HIBERNATE 初学者 因为我需要创建其中包含动态字段的动态表 所以我选择使用 hibernate 据我了解 创建表需要一个类 其中包含类中定义的字段 如何根据具有所需字段的表动态生成类 我不确定我是否理解这个问题 标题是关于
  • Android使用EGL初始化openGL2.0上下文

    我想在Android上用本机代码进行离屏图像处理 所以我需要通过EGL在本机代码中创建openGL上下文 通过EGL 我们可以创建EGLSurface 我可以看到那里有三个选择 EGL WINDOW BIT EGL PIXMAP BIT E
  • 如何在 Visual Studio 2005/2008 中编译 Flex?

    我无法弄清楚这一点 我可以从 gnuwin32 下载 flex 2 5 4a 的 win32 二进制文件 但我想使用 Visual Studio 2005 构建最新版本 2 5 35 我想我可以在 cygwin 中构建 但其中的乐趣在哪里
  • Django 日志记录旋转文件不起作用

    所以我在 Django 日志记录到达时遇到了一些问题maxBytes尺寸 基本上 当发生这种情况时 文件似乎不会旋转并创建新文件 有人告诉我这可能与服务器的写入权限有关 但我不确定如何正确设置 以便 django 在旧日志文件已满时能够创建
  • 如何更改移动布局上的 Bootstrap 3 列顺序?

    我正在制作一个带有顶部固定导航栏的响应式布局 下面有两列 一列用于侧边栏 3 一列用于内容 9 在桌面上看起来像这样 navbar 3 9 When I resize移动navbar被压缩并隐藏 然后侧边栏堆叠在内容之上 如下所示 navb
  • 在Android中将位图的大小减小到某个指定的像素

    我想将 我的位图 图像尺寸减小到最大 640 像素 例如 我有尺寸为 1200 x 1200 px 的位图图像 如何将其减小到 640px 如果你传递位图width and height然后使用 public Bitmap getResiz
  • 通过 git URL 从 lerna 管理的 monorepo 安装包

    我在我的项目中使用纱线 我的项目有一个依赖项 它恰好是 lerna 维护的较大 monorepo 的子包 子包已更新但尚未发布 我需要未发布的代码 有没有办法通过git url安装lerna的子包 Thanks 如果您的问题是 如何通过 g
  • 如何实现记住我功能? [复制]

    这个问题在这里已经有答案了 可能的重复 为网站实施 记住我 的最佳方式是什么 https stackoverflow com questions 244882 what is the best way to implement rememb
  • HttpResponseMessage 内容不会显示 PDF

    我创建了一个 Web Api 它返回一个 HttpResponseMessage 其中内容设置为 PDF 文件 如果我直接调用 Web Api 它会很好地工作 并且 PDF 会在浏览器中呈现 response Content new Str
  • Spark - 使用不同的数据类型以编程方式创建模式

    我有一个由 7 8 个字段组成的数据集 这些字段的类型为 String Int 和 Float 我尝试使用以下方法通过编程方法创建架构 val schema StructType header split map column gt Str
  • Zend框架2访问模型类中的全局配置

    我有一个模型类 它不扩展任何核心 Zend 模块 该模型是从我之前的 Zend Framework 1 应用程序导入的 我可以通过将其转换为命名空间来调用它的方法 我遇到的问题是在定义的方法中读取全局配置 对于控制器 我可以使用以下代码访问
  • R 中的 readHTMLTable 仅从篮球参考页面返回前两个表

    我正在尝试从篮球参考网站抓取球队统计网页 但当我使用 readHTML 时 它只会带回前两个表格 我的 R 代码如下所示 url http www basketball reference com leagues NBA 2015 html
  • 使用 GCD 同步 Swift 3 中的属性

    我看了今年的WWDCGCD最近谈话 我认为有一个代码片段有问题 这是关于使用以下方法使属性成为线程安全的调度队列 class MyObject private var internalState Int private let intern
  • 在 for 循环中声明匿名结构,clang 无法编译

    在 for 循环中声明匿名结构的代码在 gcc 中使用 std c99 gnu99 工作得很好 for struct int foo int bar i 0 i foo lt 10 i foo 但是 当我切换到 clang 时 我收到了错误
  • 使用 Hadoop/MapReduce 查找连接的组件

    我需要为一个巨大的数据集找到连接的组件 图是无向的 一个显而易见的选择是 MapReduce 但我是 MapReduce 的新手 我没有足够的时间来学习它并自己编写代码 我只是想知道是否有任何现有的 API 可以解决这个问题 因为这是社交网
  • Qt Creator 编译器配置问题

    我刚刚开始学习 C 并遇到了 Qt Creator 我已经将它与内置的 MinGW 编译器一起安装了 但是我无法让我的项目 构建并运行 我在下面附上了一些屏幕截图 谢谢您的帮助 最后一张图片显示了我可以选择的两个自动检测套件 我尝试创建自己
  • 如何在 Svelte 3 中拥有条件属性?

    有没有更简单的方法来编写以下复选框组件 if disabled
  • 给定一组有限的排序实数,生成总和 <= k 的所有可能子集

    我想知道是否存在解决这个问题的算法 它与背包 0 1 问题或幂集问题有点相似 但又有所不同 给定一组有限的排序实数 我们需要生成总和 解决问题的一种方法是简单地从最大数字 4 46 开始遍历 看看可以将多少个放入篮子中 然后继续向下一个最小
  • 使用多线程写入文件

    我正在尝试使用多个线程在 Java 中编写一个大文件 我都尝试过FileWriter and bufferedWriterJava 中的类 正在写入的内容实际上是使用读取的整个表 Postgres CopyManager并写下 文件中的每一