我有一个 txt 文件,它的大小大于 1GB,每一行都有一条记录。现在我想根据record.hashcode()%100把这个文件拆分成100个txt文件,怎样才能高效呢?
每条记录都有不同的长度,这里的效率是时间和内存
我有一个 txt 文件,它的大小大于 1GB,每一行都有一条记录。现在我想根据record.hashcode()%100把这个文件拆分成100个txt文件,怎样才能高效呢?
每条记录都有不同的长度,这里的效率是时间和内存
尝试通过使用同时读取和写入BufferedReader
。据我所知,它适用于大文件。
主要思想是读取行并立即将其写入其他文件。只有当你排得太长时,你才能得到糟糕的表现。
(不要将它用于二进制文件!)
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);
}
关于文件的确切数量,我认为您在这里失去了计算小文件大小的效率。
您可以尝试使用相同的方式,但读取字节而不是行。但这是方向。
我以前做过这种事情。它们对性能的关键是(对我来说很好,因为我正在通过网络写入 SAN)以并行写入。即使您的阅读是顺序的,也可能不会太糟糕。
基本算法:
中提琴
陷阱: