GeekGao

GeekGao

V2EX 第 30946 号会员,加入于 2012-12-20 03:30:05 +08:00
今日活跃度排名 1412
人生苦短,擅长打脸;
不学无数,偶尔疯癫。
根据 GeekGao 的设置,主题列表被隐藏
二手交易 相关的信息,包括已关闭的交易,不会被隐藏
GeekGao 最近回复了
全局状态用 Jotai 库管理即可
1 小时 17 分钟前
回复了 biuyixia 创建的主题 程序员 QQ 邮箱不要 FACE 啊
tx 邮箱只有几个码农维护… 有问题也属于正常了,沟通能解决最好(企业邮那边服务还凑合),不能的话就不要用了。
@liuidetmks 中国不允许有小利益集团存在,例如什么工会、互助会、行会 (手动猫头
4 小时 38 分钟前
回复了 zcj123 创建的主题 分享创造 出海新人,半个多月开发了自己的第一款产品
这种站,只适合骗骗国内新人。在国际上属于垃圾站,权重不会高的。
21 小时 6 分钟前
回复了 xzour 创建的主题 程序员 内部系统如何优雅的管理各种第三方接口
还是多年前的 SOA 治理问题
21 小时 48 分钟前
回复了 wangpugod2003 创建的主题 程序员 讨论一道面试题啊(take home task)
意思是说这思路不行???

import java.io.*;
import java.util.PriorityQueue;

public class ExternalSorter {
public static void main(String[] args) throws IOException {
String inputFile = "bigfile.txt"; // 输入文件路径
String tempDirectory = "temp"; // 临时文件目录
int maxMemory = 1024*1024*1024; // 假设最大内存使用量限制为 1GB

try (BufferedReader reader = new BufferedReader(new FileReader(inputFile))) {
String line;
int fileCounter = 0;
while ((line = reader.readLine()) != null) {
// 使用 PriorityQueue 在内存中对行进行排序
PriorityQueue<String> sortedLines = new PriorityQueue<>();
sortedLines.add(line);

// 继续读取行,直到内存使用达到限制
int memoryUsage = line.length();
while (memoryUsage <= maxMemory && (line = reader.readLine()) != null) {
sortedLines.add(line);
memoryUsage += line.length();
}

// 将排序后的行写入临时文件
File tempFile = new File(tempDirectory, "tempfile" + fileCounter + ".txt");
try (BufferedWriter writer = new BufferedWriter(new FileWriter(tempFile))) {
while (!sortedLines.isEmpty()) {
writer.write(sortedLines.poll());
writer.newLine();
}
}

fileCounter++;
}
}

// 合并临时文件
mergeTemporaryFiles(tempDirectory);

// 清理临时文件
cleanUpTemporaryFiles(tempDirectory);
}

private static void mergeTemporaryFiles(String tempDirectory) throws IOException {
File[] tempFiles = new File(tempDirectory).listFiles();
PriorityQueue<BufferedReader> readers = new PriorityQueue<>((br1, br2) -> {
try {
String line1 = br1.readLine();
String line2 = br2.readLine();
return line1.compareTo(line2);
} catch (IOException e) {
throw new RuntimeException(e);
}
});

for (File tempFile : tempFiles) {
BufferedReader reader = new BufferedReader(new FileReader(tempFile));
readers.add(reader);
}

String outputFile = "output.txt"; // 输出文件路径
try (BufferedWriter writer = new BufferedWriter(new FileWriter(outputFile))) {
while (!readers.isEmpty()) {
BufferedReader reader = readers.poll();
String line = reader.readLine();
if (line != null) {
writer.write(line);
writer.newLine();
readers.add(reader);
} else {
reader.close();
}
}
}
}

private static void cleanUpTemporaryFiles(String tempDirectory) {
File[] tempFiles = new File(tempDirectory).listFiles();
for (File tempFile : tempFiles) {
tempFile.delete();
}
}
}
21 小时 52 分钟前
回复了 wangpugod2003 创建的主题 程序员 讨论一道面试题啊(take home task)
外部排序:

1.将文件分割成多个小块,每个小块可以在内存中排序。
2. 对每个小块进行排序,并将排序后的小块写入临时文件。
3. 合并所有排序后的小块,得到一个大的排序数组。
4.从排序后的数组中选择最大的 n 个值的 ID 。
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5597 人在线   最高记录 6543   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 12ms · UTC 08:46 · PVG 16:46 · LAX 01:46 · JFK 04:46
Developed with CodeLauncher
♥ Do have faith in what you're doing.