2011-11-10 14 views
3

私は80,000行以上100列を含むCSVファイルを持っています。私は可能な限り最も効率的な方法でCSVデータのロード/アクセスを処理しようとしています。現在、CSVParserはデータをNSArrayにロードしますが、非常に遅い/遅いです。これは、私がモバイルデバイス上でこの解析/ロードを処理することを望んでいるとして、問題です:iPhone。大きなCSVファイル(Objective-C)を読み込む際のパフォーマンスの問題

代替方法の提案は大変ありがたいです。ありがとう

UPDATE:将来の参照/議論、私が今持っている次の試みのために

:私はあなたが「別の方法」によって何を意味するかわからないんだけど

// Mark time the parser starts 
NSTimeInterval start = [NSDate timeIntervalSinceReferenceDate]; 
// Parse the CSV file 
[parser parse]; 
NSTimeInterval end = [NSDate timeIntervalSinceReferenceDate]; 

// Print how long the parsing took 
NSLog(@"raw difference: %f", (end-start)); 

// Copy the allLines array from the parsing delegate 
NSArray *allOfTheRows = [NSArray arrayWithArray:d.allLines]; 
NSLog(@"There are %i lines in the csv file", [allOfTheRows count]); 

NSFileManager *f = [[NSFileManager alloc] init]; 
NSString *filePath = @"/Users/..../rawData"; // This is of course not a literal location... 

// Archive the array as NSData 
NSData *someData = [NSKeyedArchiver archivedDataWithRootObject:allOfTheRows]; 

// Write the data to a file 
[f createFileAtPath:filePath contents:someData attributes:nil]; 

/* 
If I were to load the data from the iPhone, i'd copy the newly created someData file above to my application's mainBundle, and then unarchive the NSData to an array on the iPhone 
*/ 
// Read the data back as an array 
NSData *readData = [NSData dataWithContentsOfFile:filePath]; 

NSArray *bigCollectionReadBack = [NSKeyedUnarchiver unarchiveObjectWithData:readData]; 
+0

私はデータをどのように使用しているのか、またデータが良い代替アプローチを示唆することができるかどうかにかかっていると思います。最高のオプションではないかもしれないようなCSVの音(オプションがある場合) – Danny

答えて

4

iPhoneでCSV解析に似た問題がありました。私はMac上で解析を行い、構造体データの配列を含むバイナリファイルを作成しました。 iPhone 4でCSVファイルを解析/ロードするのに120秒かかりましたが、バイナリファイルは10ミリ秒未満で読み込まれます。

EDITは - そしてfwriteを使用してバイナリファイルにデータを書き出す、マックI read the CSV fileに、もう少し手の込んだ構造体の複数のアレイにデータを整理します。 iOSでは、バイナリファイルをfread(1つはサイズ情報を取得するために読み込み、もう1つはデータを読み込む)を正しいサイズの構造体の配列に読み込みます。大きなファイルの1つは2.2MBで、freadを使用してフラッシュからRAMに読み込むには66msecかかります。

2011-11-15 17:32:35.304 -[BinFile initWithFile:] 001953f0 file Metro 
2011-11-15 17:32:35.370 -[BinFile initWithFile:] read 2217385 bytes (Metro) 
+0

お返事ありがとうございます。上記の質問をいくつかのコードで更新しました。今はNSDataとして配列をアーカイブ/アーカイブ解除しています(まだ悲しいことに少し時間がかかります) – Alec

+0

もう少し詳しいことを教えてください。[:plistの\t \t \t \t \t \t \t \t形式:NSPropertyListSerialization dataFromPropertyList NSPropertyListBinaryFormat_v1_0 errorDescription:&エラー] たNSData * binaryPlistData =:おそらく、あなたはの線に沿って何かを使用しました。 ありがとう – Alec

+0

私は上記の答えに詳細を追加しました。 – progrmr

1

お持ちの場合巨大なデータセット別の方法はあなたを助けません。あなたはあなたが次のことを行うことができ

あなたの現在の負荷プロセスを最適化しているのに役立ちます:

  1. あなたのRAM(ヒント:NSFileHandle)吹かないようにチャンクでファイルをロードし
  2. 解析オンハンドル

    :(すべてのプロセッサコアを使用して)GCDとの複数のスレッドのオブジェクトを自動解放
  3. 避け、あなたがいずれかを持っている場合は、あなたがのARP

UPDATEを使用してください

ファイルがデバイスのリソースフォルダに残っていて、外部ソースからのダウンロードのように変更できないとは言いませんでした。この場合は、progrmrの解決策を参照してください。

関連する問題