大文本查询

【问题】

I have a text file of size 13 GB. Each new  line of the file contains a table like row where vales are separated by a comma. My problem is that I have to search for a certain entry in this file. But because of the file size the normal file operations are not responding. I am using  SplFileObject Class of PHP to deal with file operations and arrays to store the tokenized value of each row and then performing comparison in each iteration for the new line

So can anyone one suggest how should I proceed in terms of data Structure or programming methodology to get better methodolog

【回答】

导入数据库这种方法能暂时解决问题,但如果数据经常变化,那这种方法就不适用了。因为导入数据的过程会非常缓慢(要处理数据一致性等问题)。这种情况用 SPL 就很容易实现,可直接查询文本文件,代码如下:



A

1

=file("D:/employee.txt").cursor@tc()

2

=A1.select(BIRTHDAY>=date("1981-01-01") && GENDER=="F")

3

=A2.fetch()

A2 中的查询条件是:1981 年 1 月 1 日(含)之后出生的女员工。这个条件可以根据需要重新改写,还可以将查询条件写在参数里,实现动态查询。如果查询结果较多,可以将 A3 改为 file(“D:/result.txt”).export(A2),这可以将计算结果直接输出到文件中。

当然除了上面这种写法外,集算器里还能直接写 SQL 查询 txt 文件,如:



A

1

$select * from test.txt where BIRTHDAY>=date('1981-01-01') and GENDER=’F’

如果想进一步提高性能,还可以使用多线程并行查询。更详细说明可以参考集算器教程 并行计算小节。 值得注意的是,文本文件导入数据库后是二进制数据,导入过程很慢,但导入后的查询性能应该会比直接使用文本文件更快。集算器也支持二进制文件 (集文件) 和索引,从文本转换成二进制数据的性能要远远超过将文本导入数据库,基于二进制文件的查询性能,在并行计算的支持下也比大多数数据库更好。关于集算器二进制文件的使用可以参阅 集文件小节