【问题标题】:Data structure to use, for large data sets from file要使用的数据结构,用于文件中的大型数据集
【发布时间】:2014-12-20 08:10:58
【问题描述】:

早安,

我正在进行一项涉及处理来自给定文件 (file1) 的大型数据集的研究。根据我的理解,数据存储与数据结构处于不同的层次,但有重叠,例如,数据结构是数据在内存中的排列,以及磁盘存储。

我需要使用另一个文件(给定的file2),然后将每个值与第一个给定文件(file1)中的值进行比较,看看它是否存在。

在文件之间进行比较时,我会将结果转储到另一个文件(file3)中。该文件将被结构化为不同的列(因为我提到了列,也许使用数据库而不是 file3 来获取结果?)

根据我上面所说的,我似乎只是在寻找快速搜索/查找(在文件之间进行比较)。

我的问题是,您认为这更适合数据结构,还是应该按原样搜索文件?我提到我只是在寻找搜索/查找操作,我倾向于哈希表,它在搜索时具有恒定的时间 O(1)。另一方面,我觉得数据结构对于处理已经使用不同存储机制(文件)构建的数据来说是一种过大的杀伤力,而数据结构最好留给我们在输入数据时使用..

希望这是有道理的。我的思路是否正确?

【问题讨论】:

  • G'day :) 如果这是一次性任务并且数据文件不是太大,那么我会使用 Excel :) 如果这是重复任务或数据不适合 Excel,那么也许某种形式的 SQL 服务器会派上用场?这样你只需要实现数据导入并编写简单的查询 - 无需考虑数据存储、结构、O(something) 搜索算法等。当然这只是务实的方法:)
  • 谢谢。如果数据不可用但随着时间的推移而设置,是否会使用数据结构?
  • 对不起,我听不懂。 (我不会说英语。)

标签: database data-structures storage disk


【解决方案1】:

对于一个小文件,您可以将所有内容读入哈希表中,由键索引。

对于大文件,可以扫描文件,将key和文件偏移量存储到hashtable中。

伪 C#:

var lookup = new Dictionary<string, long>(); // Hashtable

foreach (Record record1 in EnumerateRecords(file1))
{
    lookup[record1.Key] = file1.Position - sizeof(Record);
}

foreach (Record record2 in EnumerateRecords(file2))
{
    long file1Position;
    if (lookup.TryGetValue(record2.Key, out file1Position))
    {
        // Record exists in both files
        file1.Seek(file1Position);
        Record record1 = ReadRecord(file1);
        Process(record1, record2);

        // Remove what we found, so we know what is in file1
        // but not in file2
        lookup.Remove(record2.Key);
    }
    else
    {
        // Record exists only in file2
        Process(null, record2);
    }
}

foreach (var keyValuePair in lookup)
{
    // Record exists only in file1
    var file1Position = keyValuePair.Value;
    file1.Seek(file1Position ;
    var record1 = ReadRecord(file1);
    Process(record1, null);
}

如果需要,您可以扫描这两个文件并存储偏移量。然后比较两个哈希表是否匹配。

【讨论】:

    猜你喜欢
    • 2015-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-27
    相关资源
    最近更新 更多