C# 加载大型Visual FoxPro文件非常慢。C(OleDB)
我想将大型.DBF Visual FoxPro文件加载到数据表中。 对于小于300MB的较小文件,它可以与fill命令配合使用,并且运行速度非常快。 但对于较大的文件,我的内存不足,需要将它们加载到较小的部分。 加载第0…1000行,然后加载第1001…2000行,依此类推 根据在internet上找到的一些代码,我进行了此操作,input start是开始读取的行,max是我要读取的行数 问题是,即使我只想读取5行,由于命令.ExecuteReader的执行速度非常慢,在我的机器上也需要大约30-60秒C# 加载大型Visual FoxPro文件非常慢。C(OleDB),c#,visual-foxpro,C#,Visual Foxpro,我想将大型.DBF Visual FoxPro文件加载到数据表中。 对于小于300MB的较小文件,它可以与fill命令配合使用,并且运行速度非常快。 但对于较大的文件,我的内存不足,需要将它们加载到较小的部分。 加载第0…1000行,然后加载第1001…2000行,依此类推 根据在internet上找到的一些代码,我进行了此操作,input start是开始读取的行,max是我要读取的行数 问题是,即使我只想读取5行,由于命令.ExecuteReader的执行速度非常慢,在我的机器上也需要大约3
public DataTable LoadTable2(string folder, string table, int start, int max)
{
string ConnectionString = "Provider=vfpoledb.1;Data Source="+folder+"\\"+table;
OleDbConnection Connection = new OleDbConnection(ConnectionString);
Connection.Open();
string dataString = String.Format("Select * from {0}", table);
OleDbCommand Command = new OleDbCommand(dataString, Connection);
//Takes very long time on large files.
OleDbDataReader Reader = Command.ExecuteReader(CommandBehavior.SequentialAccess);
DataSet ds = new DataSet();
var dt = ds.Tables.Add(table);
// Add the table columns.
for (int i = 0; i < Reader.FieldCount; i++)
{
dt.Columns.Add(Reader.GetName(i), Reader.GetFieldType(i));
}
int intIdx = 0;
int cnt = 0;
while (Reader.Read())
{
if (intIdx >= start)
{
DataRow r = dt.NewRow();
// Assign DataReader values to DataRow.
for (int i = 0; i < Reader.FieldCount; i++)
r[i] = Reader[i];
dt.Rows.Add(r);
cnt++;
}
if (cnt >= max)
{
break;
}
intIdx++;
}
Reader.Close();
Connection.Close();
return dt;
}
我已经用OLE和ODBC连接进行了测试,没有大的区别。
文件都在本地光盘上
有没有人有一个好主意,如何使这更快
致意
Anders我相信,使用该驱动程序VFPOLEDB,您可以更改查询以指定感兴趣的记录编号。这样,就不需要通过阅读一堆记录来到达起点。这样就没有必要跳过任何记录;只需读取整个请求的结果集。查询可能如下所示:
SELECT * from thetable where recno() >= 5000 and recno() <= 5500
我意识到我已经安装了这个驱动程序,并且刚刚测试了它,它确实工作了。然而,我不认为它优化了该语句。理论上,它可以使用记录编号直接计算记录偏移量,但基于对更大dbf上的查询的简单观察,它似乎要进行全表扫描。然而,使用FoxPro,您可以在recno上创建索引,然后对其进行优化 这就是我们使用分页的原因。正如马克在回答某个关键问题时提到的。。。您要查询的表是否有一些可以基于的自动增量ID?如果这有一个索引,那也会有帮助。嗨,Mark thnaks,这句话是针对结果的,但不是速度。FoxPro文件是由一个我无法修改的程序生成的。注意:如果你不能使用索引字段或创建索引,那么看起来你可能运气不好。也许可以使用execscript函数并执行某种本机VFP命令来检索数据。我不确定。作为跟进:我们开发了一个小的foxpro程序,它可以将.dbf转换成.csv文件,然后更快地上传到sqldb中。