Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何有效地分割txt文件?_Java - Fatal编程技术网

Java 如何有效地分割txt文件?

Java 如何有效地分割txt文件?,java,Java,我有一个txt文件,它的大小大于1GB,每行有一条记录。现在我想根据记录将此文件拆分为100个txt文件。hashcode%100,如何有效地执行此操作 每个记录都有不同的长度,这里是有效的时间和内存尝试使用BufferedReader同时读取和写入。据我所知,它适用于大文件 其主要思想是读取该行并立即将其写入其他文件。只有排队太长的时候,你才能表现得很差 不要将其用于二进制文件 关于文件的精确计数,我认为您在这里失去了计算小文件大小的效率 您可以尝试使用相同的方法,但读取字节而不是行。但这是方

我有一个txt文件,它的大小大于1GB,每行有一条记录。现在我想根据记录将此文件拆分为100个txt文件。hashcode%100,如何有效地执行此操作


每个记录都有不同的长度,这里是有效的时间和内存

尝试使用BufferedReader同时读取和写入。据我所知,它适用于大文件

其主要思想是读取该行并立即将其写入其他文件。只有排队太长的时候,你才能表现得很差

不要将其用于二进制文件

关于文件的精确计数,我认为您在这里失去了计算小文件大小的效率


您可以尝试使用相同的方法,但读取字节而不是行。但这是方向。

我以前做过这种事情。性能的关键在于我,因为我正在通过网络向SAN写入数据以并行写入。即使你的阅读是按顺序进行的,也可能不太糟糕

基本算法:

创建一个ExecutorService,线程数量有限。 创建一个映射以保存所有输出文件 打开输出文件,创建一个Writer并将其添加到地图中,键为1..100 从循环中的输入读取每一行,并将其作为任务添加到执行器中 在任务中,它在与读取器分离的线程中运行,解析行,计算散列,查找文件,在文件上同步,这样其他线程就不会踩踏您,然后写入行 关闭所有文件 中提琴

格查斯:

当executor服务的输入队列变满时,就会发生不好的事情,具体取决于它的配置方式。此外,无边界队列也不好。 文件对象上的同步看起来不太好,但我曾经尝试过另一种方法,确保每个文件有一个线程,因此不需要锁定,但它并不比ExecutorService方法快,因此最终不值得付出努力。
你是什么意思?你是否考虑在不同的线程中以不同的块进行读/写?记录是固定长度的还是可变长度的?这里是什么?记忆力并行执行?record.hashcode与任何事情都有什么关系?您认为将1GB文件放入缓冲区可以吗?@Ketan是的,但如果数据不是二进制的。对于二进制数据,可以尝试BufferedInputStream。但它是基于行中有多少个字符…@Ketan在postGreat的标题中添加了描述!!明白了,谢谢。
int maxlinesNumber = 1000; // I took it randomly, 
BufferedReader rd = null;
BufferedWriter wt = null;

try {
  rd = new BufferedReader(
              new InputStreamReader(
                  new FileInputStream("/yourfile.txt"), "UTF-8")
              );

 int count = 0;

for (String line; (line = reader.readLine()) != null;) {
    if (count++ % maxlinesNumber == 0) {
        close(wt);
        wt = new BufferedWriter(
                   new OutputStreamWriter(
                      new FileOutputStream(
             "/newSmalfile" + (count / maxlinesNumber) + ".txt"), "UTF-8")
              );
    }
    wt.write(line);
    wt.newLine();
 }
} finally {
close(wt);
close(rd);
}