我有几个大数据(每个1G)文件包含人的信息(只是姓名和电话号码)。格式清晰灵活。问题是加载并处理它们。处理其中一个可能仍然可行但如果我想在特定目录下处理它们,事情变得棘手。当我使用
File file = chooser.getSelectFile();
并获取一个目录,我认为下一步是将文件放在文件数组中:
File[] files = file.ListFile();
但这会导致问题吗?由于每个文件都是1G,因此VM的内存不会将所有这些文件保存在一起。为了以后搜索它们,我想我可能想先对它们进行排序。如何对这些单个文件进行排序?由于总大小如此之大,我们的想法是:将它们放入像A.txt,B.txt这样以文字A和B开头的文件是不够的。
答案 0 :(得分:1)
文件只代表文件名,而不是内容。除非每个目录有数千个文件,否则你还没有做任何事情来使用大量内存。
不要尝试通过将每个文件完全加载到内存中来处理这些文件。
答案 1 :(得分:0)
File
仅存储文件句柄,而不存储文件本身的内容。只有当您打开该文件并读取其内容时,该文件的内容才会在Java堆上结束。
我建议您在阅读时使用InputStream
并处理文件内容,而不是将整个文件加载到内存中然后进行处理。
答案 2 :(得分:0)
如果您的主存储器无法容纳大量数据,则可以开始使用辅助存储器。所以问题归结为你想用名字和电话号码做什么。
假设您有100个随机放置姓名和电话号码的文件,您需要程序快速查找姓名的电话号码。理想的方法是创建一个名称和电话号码为HashMap的值。但由于您的内存无法保存整个内容,因此您可能需要考虑以更好的方式将数据存储在辅助内存中。例如,所有以A开头的名称都将它们存储在名为A.txt的文件中,所有以B开头的名称都将存储在B.txt中,依此类推。
现在,当您想要搜索名称时,找到起始字符并查看相应的文件。