• 作者:老汪软件技巧
  • 发表时间:2024-10-11 07:01
  • 浏览量:

在 Go 语言中找出两个大文件中相同的记录,可以采用以下策略:

思路读文件:按行逐行读取两个文件中的记录,假设每个文件的每一行代表一条记录。使用哈希集合(Set):因为哈希集合能够快速判断某个记录是否存在,所以我们可以将第一个文件中的记录放入集合中,之后读取第二个文件时逐行判断该记录是否也存在于集合中。如果存在则是相同的记录。性能优化代码实现

package main
import (
    "bufio"
    "fmt"
    "os"
    "log"
)
// 从文件中读取数据并返回一个map,记录每一行的出现次数
func readFileToSet(filename string) (map[string]bool, error) {
    file, err := os.Open(filename)
    if err != nil {
        return nil, err
    }
    defer file.Close()
    recordSet := make(map[string]bool)
    scanner := bufio.NewScanner(file)
    for scanner.Scan() {
        line := scanner.Text()
        recordSet[line] = true
    }
    if err := scanner.Err(); err != nil {
        return nil, err
    }
    return recordSet, nil
}
// 找出两个文件中相同的记录
func findCommonRecords(file1, file2 string) ([]string, error) {
    // 读取第一个文件到Set
    recordSet, err := readFileToSet(file1)
    if err != nil {
        return nil, err
    }
    // 打开第二个文件并逐行读取
    file, err := os.Open(file2)
    if err != nil {
        return nil, err
    }
    defer file.Close()
    var commonRecords []string
    scanner := bufio.NewScanner(file)
    for scanner.Scan() {
        line := scanner.Text()
        if recordSet[line] {
            commonRecords = append(commonRecords, line)
        }
    }
    if err := scanner.Err(); err != nil {
        return nil, err
    }
    return commonRecords, nil
}
func main() {
    file1 := "file1.txt"
    file2 := "file2.txt"
    commonRecords, err := findCommonRecords(file1, file2)
    if err != nil {
        log.Fatalf("Error finding common records: %v", err)
    }
    fmt.Println("Common Records:")
    for _, record := range commonRecords {
        fmt.Println(record)
    }
}

代码分析

readFileToSet:

findCommonRecords:

main:

性能优化

减少内存占用:

并发处理:

查找相同的文件__如何快速查找相同文件

使用案例

假设 file1.txt 和 file2.txt 的内容如下:

file1.txt:

apple
banana
cherry
grape
orange

file2.txt:

pear
banana
grape
watermelon
apple

运行程序后,输出结果为:

Common Records:
apple
banana
grape

结论

这种解决方案使用哈希集合快速查找,可以高效处理两个大文件的记录比较,且通过 bufio.Scanner 逐行读取文件,避免一次性加载整个文件到内存中的问题。