2017-07-03 11 views
0

非常に大きなデータセットで作業していますが、その答えが見つからない問題があります。 私はここにJSONデータを解析しようとしていますが、私は、全体のデータセットからのデータの作品のためにしたとどのような作品です:PythonでBIG JSONファイルを解析する方法

import json 

s = set() 

with open("data.raw", "r") as f: 

    for line in f: 
     d = json.loads(line) 

紛らわしい部分があること、私は(私のメインデータにこのコードを適用するとそれは助け...しかし、このデータ型は、小さなデータセットに対してもあれば

d = json.loads(line) 
    File "C:\Users\Sathyanarayanan\AppData\Local\Programs\Python\Python35-32\lib\json\__init__.py", line 319, in loads 
    return _default_decoder.decode(s) 
    File "C:\Users\Sathyanarayanan\AppData\Local\Programs\Python\Python35-32\lib\json\decoder.py", line 339, in decode 
    obj, end = self.raw_decode(s, idx=_w(s, 0).end()) 
    File "C:\Users\Sathyanarayanan\AppData\Local\Programs\Python\Python35-32\lib\json\decoder.py", line 357, in raw_decode 
    raise JSONDecodeError("Expecting value", s, err.value) from None 
json.decoder.JSONDecodeError: Expecting value: line 2 column 1 (char 1) 

タイプ(F)= TextIOWrapper:サイズは約200G)それがメモリから出て行くことなく、次のエラーを()を示しています。 ..

フォーマットを確認するために私のデータのいくつかの行があります:

{"MessageType": "SALES.CONTRACTS.SALESTATUSCHANGED", "Event": {"Id": {"Source": 1, "SourceId": "ZGA=-3-1-002-0801743-2330650"}, "RefInfo": {"TenantId": {"Id": "ZGA="}, "UserId": {"Id": "ZMKj"}, "SentUtc": "2013-01-14T20:17:57.9681547", "Source": 1}, "OldStatus": {"Status": 3, "AutoRemoveInfo": null}, "NewStatus": {"Status": 4, "AutoRemoveInfo": null}, "Items": {"Items": [{"Id": {"Id": 1193}, "Sku": {"Sku": "Con BM20"}, "Quantity": 1, "UnitPrice": {"amount": 11.92, "currency": 840}}], "FulfilledItems": []}, "ShippingInfo": {"Carrier": "", "Class": "", "Region": null, "Country": 0, "PostalCode": null, "Costs": null, "Charges": null}, "SaleDate": "2013-01-13T13:39:57", "PendingItems": null, "Kits": null, "Products": null, "OldSaleDate": "0001-01-01T00:00:00", "AdditionalSaleInfo": null}} 
{"MessageType": "SALES.CONTRACTS.SALESHIPPINGINFOCHANGED", "Event": {"Id": {"Source": 1, "SourceId": "ZGA=-3-1-002-0801743-2330650"}, "RefInfo": {"TenantId": {"Id": "ZGA="}, "UserId": {"Id": "ZMKj"}, "SentUtc": "2013-01-14T20:17:57.9681547", "Source": 1}, "Status": {"Status": 4, "AutoRemoveInfo": null}, "Items": {"Items": [{"Id": {"Id": 1193}, "Sku": {"Sku": "Con BM20"}, "Quantity": 1, "UnitPrice": {"amount": 11.92, "currency": 840}}], "FulfilledItems": []}, "OldShippingInfo": {"Carrier": "", "Class": "", "Region": null, "Country": 0, "PostalCode": null, "Costs": null, "Charges": null}, "NewShippingInfo": {"Carrier": "USPS", "Class": "FIRST/RECTPARCEL", "Region": null, "Country": 0, "PostalCode": null, "Costs": null, "Charges": null}, "SaleDate": "0001-01-01T00:00:00", "PendingItems": null, "Kits": null, "Products": null, "OldSaleDate": "0001-01-01T00:00:00", "AdditionalSaleInfo": null}} 
{"MessageType": "SALES.CONTRACTS.SALECREATED", "Event": {"Id": {"Source": 1, "SourceId": "ZGA=-3-1-002-4851828-6514632"}, "RefInfo": {"TenantId": {"Id": "ZGA="}, "UserId": {"Id": "ZMKj"}, "SentUtc": "2013-01-14T20:17:58.1402505", "Source": 1}, "Status": {"Status": 4, "AutoRemoveInfo": null}, "Items": {"Items": [{"Id": {"Id": 9223372036854775807}, "Sku": {"Sku": "NFL Blanket Seahawks"}, "Quantity": 1, "UnitPrice": {"amount": 22.99, "currency": 840}}], "FulfilledItems": []}, "ShippingInfo": {"Carrier": "USPS", "Class": "FIRST/RECTPARCEL", "Region": null, "Country": 0, "PostalCode": null, "Costs": null, "Charges": null}, "SaleDate": "2013-01-13T15:51:12", "Kits": null, "Products": null, "AdditionalSaleInfo": null}} 
{"MessageType": "SALES.CONTRACTS.SALECREATED", "Event": {"Id": {"Source": 1, "SourceId": "ZGA=-3-1-102-3824485-2270645"}, "RefInfo": {"TenantId": {"Id": "ZGA="}, "UserId": {"Id": "ZMKj"}, "SentUtc": "2013-01-14T20:17:58.3436109", "Source": 1}, "Status": {"Status": 4, "AutoRemoveInfo": null}, "Items": {"Items": [{"Id": {"Id": 9223372036854775807}, "Sku": {"Sku": "NFL CD Wallet Chargers"}, "Quantity": 1, "UnitPrice": {"amount": 12.99, "currency": 840}}], "FulfilledItems": []}, "ShippingInfo": {"Carrier": "USPS", "Class": "FIRST/RECTPARCEL", "Region": null, "Country": 0, "PostalCode": null, "Costs": null, "Charges": null}, "SaleDate": "2013-01-12T02:49:58", "Kits": null, "Products": null, "AdditionalSaleInfo": null}} 

私はすでに最初の2000行を解析しているので、それは完璧に動作しているため、Jsonです。しかし、大きなファイルに同じ手順を使用しようとすると、データの最初の行からのエラーが表示されます。

+0

このjsonデータにはどのような変更を行う必要がありますか? – RomanPerekhrest

+0

'data.raw'はjsonファイルか、各行にjsonオブジェクトを持つファイルですか?前者の場合は、['json.load'](https://docs.python.org/3.5/library/json.html#json.load)を使用してください。 – Will

+0

ファイルが有効なJSONではありません。しかし、各行に有効なJSONテキストが含まれているようです。私のアドバイスは、この "JSON"(実際にはJSONではありません)を生成しているものを修正します。それ以外に、行単位で行えば、逆シリアル化されたオブジェクトをリストや何かに蓄積することができると思います。 –

答えて

2

はここでデータが有効なJSONではないかを確認するためにいくつかの簡単なコードだと、それがどこにあるか:

for i, line in enumerate(f): 
    try: 
     d = json.loads(line) 
    except json.decoder.JSONDecodeError: 
     print('Error on line', i + 1, ':\n', repr(line)) 
+0

@alexありがとうございます。私はこのコードを使用し、結果は奇妙です!結果によると、私はすべての偶数行に誤りがあります!しかし、私は大きなファイルの最初の2000行を使用していましたが、何のエラーも表示されません...それはとても混乱しています... – Mina

+0

@Minaはエラーメッセージの1つを表示できますか?特に私は失敗した行を見たい。 –

+0

あなたはそれを信じることができませんが、それはポイントでした:私が余分に含まれているメインの大きなファイルが行間に入り、それはエラーメッセージの理由でした!ところで、あなたの提案はエラーの原因を見つけるのに非常に役立ちました。ありがとうございました。 – Mina

1

良い解決策は、大きなJSONデータセットを読み取るために、それはpythonyieldのような発電機を使用することで、あなたのjsonパーサーがメモリ内にファイル全体を保存した場合、200Gは大きすぎるため、メモリはイテレータで保存されます。

Pythonicインターフェイスhttp://pypi.python.org/pypi/ijson/で反復JSONパーサーを使用できます。

ただし、ファイルには.rawという拡張子が付きます。これはjsonファイルではありません。

そのDOを読むために:

import numpy as np 

content = np.fromfile("data.raw", dtype=np.int16, sep="") 

しかし、この解決策は、大きなファイルのためにクラッシュすることができます。実際.raw.csvファイルに思われる場合

、あなたはそのようなあなたの読者を作成することができます。

import csv 

def read_big_file(filename): 
    with open(filename, "rb") as csvfile: 
     reader = csv.reader(csvfile) 
     for row in reader: 
      yield row 

またはテキストファイルのtahtよう

def read_big_file(filename): 
    with open(filename, "r") as _file: 
     for line in _file: 
      yield line 

使用rb場合にのみ、あなたのファイルはバイナリです。

実行します。

for line in read_big_file(filename): 
    <treatment> 
    <free memory after a size of chunk> 

私はでき正確な私の答えあなたは、ファイルの最初の行を与えれば。

関連する問題