我正在构建一个C#程序来读取Google Freebase data dump中的RDF数据.首先,我编写了一个简单的循环来简单地读取文件并获得三元组的计数.但是,我的程序只计数了约1150万,然后退出,而不是按照文档页面(如上所述)中列出的19亿计数.源代码的相关部分如下(运行大约需要30秒).
我在这里想念什么?
// Simple reading through the gz file
try
{
using (FileStream fileToDecompress = File.Open(@"C:\Users\Krishna\Downloads\freebase-rdf-2014-02-16-00-00.gz", FileMode.Open))
{
int tupleCount = 0;
string readLine = "";
using (GZipStream decompressionStream = new GZipStream(fileToDecompress, CompressionMode.Decompress))
{
StreamReader sr = new StreamReader(decompressionStream, detectEncodingFromByteOrderMarks: true);
while (true)
{
readLine = sr.ReadLine();
if (readLine != null)
{
tupleCount++;
if (tupleCount % 1000000 == 0)
{ Console.WriteLine(DateTime.Now.ToShortTimeString() + ": " + tupleCount.ToString()); }
}
else
{ break; }
}
Console.WriteLine("Tuples: " + tupleCount.ToString());
}
}
}
catch (Exception ex)
{ Console.WriteLine(ex.Message); }
(我尝试在dotNetRdf中使用GZippedNTriplesParser通过在this recommendation上构建数据来读取数据,但这似乎在一开始就在RdfParseException上令人窒息(Tab分隔符?UTF-8?).因此,此刻,尝试滚动我的拥有).
解决方法:
Freebase RDF转储由输出200个单独的Gzip文件的map / reduce作业构建.然后将这200个文件串联到一个最终的Gzip文件中. According to the Gzip spec,将多个Gzip文件中的原始字节连接起来将产生一个有效的Gzip文件.符合规范的库在解压缩该文件时应产生一个包含每个输入文件的串联内容的文件.
根据您看到的三元组数量,我猜您的代码只是解压缩文件的第一块而忽略其他199.我不是C#程序员,但是从阅读another * answer看来,切换到DotNetZip将解决此问题.