遅延読み込みモードによる大量データの高速読み込み

このドキュメントでは、遅延読み込みを使用してReoGridに大規模なデータセットを効率的に読み込む方法を説明します。遅延読み込みの実装方法を示す具体的なコード例を提供します。

ステップ1:ワークシートの初期化

まず、ワークシートを初期化し、ユーザーインターフェースコンポーネントを設定します。

public partial class LazyLoadPerformanceDemo : UserControl
{
    private Worksheet worksheet;

    public LazyLoadPerformanceDemo()
    {
        InitializeComponent();
    }

    public static int RECORD_COUNT = 1000000;
    public static int COLUMN_COUNT = 12;

    List<FlightLog> logs;

    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);

        // Generate data
        logs = FlightLogGenerator.GenerateFlightLogs(RECORD_COUNT);
    }
}

ステップ2:データの生成

大規模なデータセットを生成するメソッドを作成します。この例では、フライトログデータを生成します。

public class FlightLogGenerator
{
    public static List<FlightLog> GenerateFlightLogs(int numRows = 10000)
    {
        Random rand = new Random();
        DateTime startTime = DateTime.Now;
        List<FlightLog> logs = new List<FlightLog>();

        string[] weatherOptions = { "Sunny", "Cloudy", "Rain", "Snow" };

        for (int i = 0; i < numRows; i++)
        {
            logs.Add(new FlightLog
            {
                Timestamp = startTime.AddMilliseconds(200 * i),
                Speed = Math.Round(rand.NextDouble() * 180, 2),
                Distance = Math.Round(rand.NextDouble() * 1000, 2),
                Throttle = rand.Next(0, 101),
                EngineBrake = rand.Next(0, 101),
                Fuel = Math.Round(rand.NextDouble() * 100, 2),
                DoorStatus = rand.Next(0, 2) == 1,
                GPSLatitude = Math.Round(35.0 + rand.NextDouble() * 10, 6),
                GPSLongitude = Math.Round(135.0 + rand.NextDouble() * 10, 6),
                Weather = weatherOptions[rand.Next(weatherOptions.Length)]
            });
        }

        return logs;
    }
}

ステップ3:データソースの作成

ワークシートにデータを提供するデータソースクラスを実装します。

// Data source
public class FlightLogDataSource : IDataSource<FlightlogDataRecord>
{
  public List<FlightLog> Logs { get; private set; }

  private FlightlogDataRecord[] initedRecords;

  public FlightLogDataSource(List<FlightLog> logs)
  {
    this.Worksheet = worksheet;
    this.Logs = logs;
    this.initedRecords = new FlightlogDataRecord[logs.Count];
  }

  public int RecordCount => Logs.Count;
  public int ColumnCount => LazyLoadPerformanceDemo.COLUMN_COUNT;

  public bool SuspendDataChangeEvent { get; set; }
  public event EventHandler<DataSourceChangedEventArgs> OnInputDataChanged;

  // Get data for the specified row
  public FlightlogDataRecord GetRecord(int row)
  {
    FlightlogDataRecord record = initedRecords[row];

    if (record == null)
    {
      record = new FlightlogDataRecord(this, row, Logs[row]);
    }

    // Return row data
    return record;
  }
}

// Data record
public class FlightlogDataRecord : IDataRecord
{
  private FlightLogDataSource source;
  private int row;
  public FlightLog LogData { get; private set; }
  public FlightlogDataRecord(FlightLogDataSource source, int row, FlightLog logData)
  {
    this.source = source;
    this.row = row;
    this.LogData = logData;
  }

  public object GetData(int columnIndex) {
    switch (columnIndex)
    {
      case 0: return $"No. {row + 1}";
      case 1: return LogData.Timestamp;
      case 2: return LogData.Speed;
      case 3: return LogData.Distance;
      case 4: return LogData.Throttle;
      case 5: return LogData.EngineBrake;
      case 6: return LogData.Fuel;
      case 7: return LogData.DoorStatus;
      case 8: return LogData.GPSLatitude;
      case 9: return LogData.GPSLongitude;
      case 10: return LogData.Weather;
      case 11: return $"=ROUND({new CellPosition(row, 4).ToAbsoluteAddress()} / {new CellPosition(row, 5).ToAbsoluteAddress()}, 1)";
    }
    return null;
  }
}

ステップ4:遅延読み込みでデータを読み込む

データソースを使用して、遅延読み込みモードでワークシートにデータを読み込み、パフォーマンスを向上させます。

private void button1_Click(object sender, EventArgs e)
{
    // Change the number of worksheet rows
    worksheet.SetRows(logs.Count);

    // Set the data source in lazy loading mode
    worksheet.AddDataSource(
        new RangePosition(0, 0, logs.Count, COLUMN_COUNT),
        new FlightLogDataSource(logs),
        // Enable lazy loading
        DataSourceLoadMode.LazyLoading);
}

これらの手順に従うことで、データソースと遅延読み込みモードを使用して、大規模なデータセットをReoGridワークシートに効率的に読み込むことができます。

罫線とセルの書式設定の適用

GetRecordメソッドが呼び出された際に、罫線とセルの書式設定を設定できます。以下の例では、ワークシートインスタンスを使用して罫線を設定します。

public class FlightLogDataSource : IDataSource<FlightlogDataRecord>
{
    public Worksheet Worksheet { get; private set; }

    private FlightlogDataRecord[] initedRecords;
    ...

    public FlightLogDataSource(Worksheet worksheet, List<FlightLog> logs)
    {
        this.Worksheet = worksheet;
        this.Logs = logs;
        this.initedRecords = new FlightlogDataRecord[logs.Count];
    }

    ...

    // Modify the GetRecord method as follows
    public FlightlogDataRecord GetRecord(int row)
    {
        FlightlogDataRecord record = initedRecords[row];

        if (record == null)
        {
          record = new FlightlogDataRecord(this, row, Logs[row]);
          initedRecords[row] = record;

          // Set row borders when the row is accessed for the first time
          Worksheet.SetRangeBorders(row, 0, 1, ColumnCount, BorderPositions.Outside, RangeBorderStyle.BlackSolid);
          Worksheet.SetRangeBorders(row, 0, 1, ColumnCount, BorderPositions.InsideVertical, RangeBorderStyle.GrayDotted);
        }

        // Return row data
        return record;
    }

    ...
}

遅延読み込みの原理と注意事項

遅延読み込みは、大規模なデータセットを効率的に扱うための技術です。セルに初めてアクセスされた時(レンダリング、数式参照、コードによるクエリなど)、そのデータがデータセットから読み込まれます。例えば、100万行のデータがある場合、最初に表示される約30行のみが読み込まれます。ユーザーがスクロールすると、必要に応じてさらにデータが読み込まれます。

数式とセル参照のサポート

遅延読み込みは数式もサポートしています。セルがまだレンダリングされていなくても、数式によって参照されている場合、アクセス時に対応するセルが自動的に読み込まれます。

遅延読み込みに関する注意事項

遅延読み込みは1回だけ実行されます。既に読み込まれたワークシートでデータを削除して再読み込みした場合、読み込み済み状態がリセットされないため、遅延読み込みは再度機能しません。そのため、データを再読み込みする必要がある場合は、ワークシートを再作成するなどのアプローチを取る必要があります。


ページの内容は役に立ちましたか?