Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.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 哪个文件写入速度更快?_Java_Performance_Data Structures_Io_Main Memory Database - Fatal编程技术网

Java 哪个文件写入速度更快?

Java 哪个文件写入速度更快?,java,performance,data-structures,io,main-memory-database,Java,Performance,Data Structures,Io,Main Memory Database,我在处理大文件和内存限制方面的经验很少。 请注意,我使用Java作为编程语言 我必须找到文件大小为15GB的记录,然后将结果写入另一个文件。基本上,它是一个搜索范围函数实现。我的目标是将范围内的记录写入结果文件,并用新行分隔。也就是说,每条记录都应该放在单独的行上。此类查询的数量约为400-1000。因此,每个查询将导致写入许多位于其范围内的记录 那么,以下哪种方法更快 1-一旦我开始获取查询范围记录,我就开始连续地将它们写入文件 2-我将我的记录存储在某个字符串中,并为找到的每个记录追加字符串

我在处理大文件和内存限制方面的经验很少。 请注意,我使用Java作为编程语言

我必须找到文件大小为15GB的记录,然后将结果写入另一个文件。基本上,它是一个搜索范围函数实现。我的目标是将范围内的记录写入结果文件,并用新行分隔。也就是说,每条记录都应该放在单独的行上。此类查询的数量约为400-1000。因此,每个查询将导致写入许多位于其范围内的记录

那么,以下哪种方法更快

1-一旦我开始获取查询范围记录,我就开始连续地将它们写入文件

2-我将我的记录存储在某个字符串中,并为找到的每个记录追加字符串,然后最后写入它

3-使用字符串生成器连接每个查询的结果,然后在最后写入文件?但是字符串生成器不支持新行

4-制作我自己的数据结构

5-创建一个记录数组列表,然后在最后迭代以写入文件


请告诉我哪种方法在IO和MM方面最快。

操作系统级写缓冲非常有效。使用#1,除非您的探查器数据表明存在问题。

操作系统级写缓冲非常有效。使用#1,除非您有探查器数据表明存在问题。

2和3听起来都像是本地实现的缓冲。一种更简单、更有效的方法是使用
缓冲输出流
包装
文件输出流


如果您谈论的是大量的记录,那么第5个可能是个坏主意,因为实际上可能会导致交换(这只会影响性能)。

2和3听起来都像是本地实现的缓冲。一种更简单、更有效的方法是使用
缓冲输出流
包装
文件输出流


如果您谈论的是大量的记录,那么第5条可能是个坏主意,因为实际上可能会导致交换(这只会影响性能)。

我认为Map和Reduce最适合于此。我没有做过这方面的工作,但是参加了一个关于同一个问题的会议,这个家伙用了同样的例子。将文件拆分,让多个程序运行同一个搜索查询-Map,搜索完成后,可以使用Reduce将所有答案合并为一个,我认为Map和Reduce最适合这样做。我没有做过这方面的工作,但是参加了一个关于同一个问题的会议,这个家伙用了同样的例子。将您的文件拆分,让多个程序运行相同的搜索查询-映射,然后一旦搜索完成,所有答案都可以使用Reduce组合成一个。到目前为止,我使用的方法是将记录写入大小等于PageSize(4096K)的缓冲区,然后使用Java随机访问文件。写入字符以写入一页大小的字符串缓冲区。但是你说的方法似乎要快得多。所以,现在我将尝试使用这个。非常感谢。到目前为止,我使用的方法是将记录写入大小等于PageSize(4096K)的缓冲区,然后使用Java随机访问文件。写入字符以写入一页大小的字符串缓冲区。但是你说的方法似乎要快得多。所以,现在我将尝试使用这个。非常感谢。我们不能使用数据库,因为它是一个用Java构建数据库的项目,所以我们不能使用任何提供索引或数据库相关功能的库。对不起,您所说的未标记回答问题是什么意思?你是在谈论我在堆栈溢出问题上提出的其他问题吗?非常感谢。不是说StringBuilder是最好的解决方案,但我几乎肯定它支持newlineWell,我们不能使用数据库,因为它是一个用Java构建数据库的项目,所以我们不能使用任何提供索引或数据库相关功能的库。对不起,您所说的未标记回答问题是什么意思?你是在谈论我在堆栈溢出问题上提出的其他问题吗?非常感谢。不是说StringBuilder是最好的解决方案,但我几乎肯定它支持NewLine。实际上,我的密钥不是唯一的。我的数据只有两列,一列是key,另一列是value。该键的大小从7到15位不等,并且在数据中也会重复该键。所以我怀疑我是否可以像MapReduce对键使用哈希一样对键使用哈希。非常感谢你的建议。实际上我的钥匙不是唯一的。我的数据只有两列,一列是key,另一列是value。该键的大小从7到15位不等,并且在数据中也会重复该键。所以我怀疑我是否可以像MapReduce对键使用哈希一样对键使用哈希。非常感谢你的建议。好的,谢谢!我现在正在尝试。+1:别忘了使用像BufferedOutputStream这样的缓冲区。如果您的程序足够高效,您的瓶颈可能是I/O。好的,谢谢!我现在正在尝试。+1:别忘了使用像BufferedOutputStream这样的缓冲区。如果您的程序足够高效,您的瓶颈可能是I/O。