I propose enhanced way to split the table into multiple chunks by ROWID

There is a good methodology, called as ROWID Parallelism, introduced by Thomas Kyte ([http://asktom.oracle.com/pls/asktom/f?p=100:11:0::NO::P11_QUESTION_ID:10498431232211]) and explained in his book "Effective Oracle by Design". But there is a one problem with base query – max number of chunks is constrained by number of extents, allocated for table. So max number of parallel processes is constrained too. To overcome this problem I propose new query based on blocks rather than extents. In this query max number of chunks is constrained only by number of blocks, allocated for table, rather than allocated extents:
define TNAME=<write table name here>
define CHUNKS=<write desired number of chunks here>
with extent_blocks as
( select relative_fno,
block_id,
blocks,
( sum( blocks ) over( order by relative_fno,
block_id rows unbounded preceding )) - blocks + 1 as block_1,
sum( blocks ) over( order by relative_fno,
block_id rows unbounded preceding ) as block_2
from dba_extents
where segment_name = UPPER( '&TNAME' )
and owner = user ),
range_blocks as
( select row_num,
b1,
b2
from ( select ROWNUM as row_num,
( part_n *( ROWNUM - 1 )) + 1 as b1,
case
when part_n * ROWNUM > s.last_n
then s.last_n
else part_n * ROWNUM
end as b2
from ( select ROWNUM
from DUAL
start with dummy = dummy
connect by dummy = dummy ),
( select sum( de.blocks ) as last_n,
CEIL( sum( de.blocks ) / &CHUNKS ) as part_n
from extent_blocks de ) s
where ROWNUM <( &CHUNKS + 1 ))
where b1 <= b2 )
select r1.row_num n,
DBMS_ROWID.rowid_create( 1,
obj.data_object_id,
r1.relative_fno,
r1.block_id +( r1.b1 - r1.block_1 ),
0
) min_rowid,
DBMS_ROWID.rowid_create( 1,
obj.data_object_id,
r2.relative_fno,
r2.block_id +( r2.b2 - r2.block_1 ),
32767
) max_rowid
from ( select rb.row_num,
rb.b1,
eb.relative_fno,
eb.block_id,
eb.block_1
from range_blocks rb,
extent_blocks eb
where rb.b1 between eb.block_1 and eb.block_2 ) r1,
( select rb.row_num,
rb.b2,
eb.relative_fno,
eb.block_id,
eb.block_1
from range_blocks rb,
extent_blocks eb
where rb.b2 between eb.block_1 and eb.block_2 ) r2,
( select data_object_id
from user_objects
where object_name = UPPER( '&TNAME' )) obj
where r1.row_num = r2.row_num
Denis Komarov

All well and good, but a couple of questions for you.
1) any specific reason why you'd post that here as opposed to the site you've linked to?
2) "So max number of parallel processes is constrained too."
This is true of your method as well, seeing as how you can only have so many parallel processes before you stress the machine to the point of having the parallel processes fight each other for resources. I wouldn't imagine you can actually make use of the number of parallel processes you propose (you seem to want a very high number of them).
In practicality, i think the method demonstrated by Tom would be more than sufficient, but please do feel free to put together a test case and prove me wrong......

Similar Messages

  • Split the IDOC into multiple IDOC if the IDOC has more than 500 records

    Hi All,
    I developed an outbound IDOC in which we are facing an issue.
    There is some limitation on the maximum idoc size it can handle.
    If number of records is more than 500, split the idoc into multiple iDoc's, e.g. if it would have 1300 records , the result would be 2 iDoc's with 500 records, and the last one would have 300 records
    How can i acheive this.
    Regards
    Jai

    Hi,
    1) first you need to know which message type/Idoc type you are triggering.
    2) Get the Corresponding processcode from Partner profiles(WE20/ WE41).
    3) Then the look for prper user-exit in the related processing FM.
    4) write logic to split the IDoc accordingly.
    if no proper user exit available then copy the standard processing FM and need to all ALE related configurations.
    Catch hold any ABAP expert in your team to do all these.
    Suresh

  • Split the data into multiple  rows in table

    Hello,
    I am using Oracle 10g apex 3.2.
    I have a requirement like this.
    I have a table like TableA
    Col1 Col2
    90 1
    91 1:2:3
    92 3
    I want the data like
    Col1 Col2
    90 1
    91 1
    91 2
    91 3
    92 3
    How to do this?
    Thanks
    Edited by: user13305573 on Aug 3, 2010 8:16 PM

    with
       your_data as
       select 90 as col1, '1'  as col2      from dual union all
       select 91, '1:2:3'   from dual union all
       select 92, '3'       from dual
    select
       y.col1,   
       regexp_substr(y.col2, '[^:]+', 1, t1.column_value) as col2
    from
       your_data y,
    13     table(cast(multiset(select level from dual connect by  level <= length (regexp_replace(y.col2, '[^:]+'))  + 1) as sys.OdciNumberList)) t1
    14  /
                  COL1 COL2
                    90 1
                    91 1
                    91 2
                    91 3
                    92 3
    5 rows selected.
    Elapsed: 00:00:00.05
    ME_XE?select * from v$version;
    BANNER
    Oracle Database 10g Express Edition Release 10.2.0.1.0 - Product
    PL/SQL Release 10.2.0.1.0 - Production
    CORE     10.2.0.1.0     Production
    TNS for Linux: Version 10.2.0.1.0 - Production
    NLSRTL Version 10.2.0.1.0 - Production
    5 rows selected.
    Elapsed: 00:00:00.03
    ME_XE?

  • Splitting Long Table Into Shorter Ones

    I have a very long table in Pages and now I need to add a little text in between some of the rows.  Is there any way to split the table into a bunch of smaller ones where I need to?  Or am I going to have to recreate each new table individually somehow...?!
    Thanks so much for any help!

    You could insert a row and put your text where you want it,
    or
    Duplicate the table and delete the parts you don't want.
    Peter

  • Oracle rownum usage for splitting a Table into two equal parts.

    Hi All,
    I have a table which has like 1.2 billion records and i would have to split the table in two parts for my Archiving needs.Unfortunately that table does not have any unique key or primary key or data stamp which i can rely for.
    I would have to use the rownum concept to divide the table.
    I am using the below
    SELECT * FROM (SELECT ENAME, SAL FROM EMP ORDER BY SAL DESC) WHERE ROWNUM < 5000000;
    But the problem is that the table is taking forever to retrieve as it has to do a order by and then retrieve the data as per the where clause.
    The question i have is that instead of using a orderby clause to get the same rownum for the row every time, can i directly rely on the fact that the database is read only and the Rownum would remain same even without oder by clause....
    Thanks....

    WARNING! There is a bug in the code, see EDIT: at bottom of post for details
    Justin,
    It makes sense that Oracle could order over rowid without sorting, but I see a sort in the explain plan:
    SQL> create table t as select 1 as data
      2  from all_objects
      3  where rownum <= 100000;
    Table created.
    SQL> explain plan for select *
      2  from (select t.*, row_number() over (order by rowid) rn from t)
      3  where rn < 50000;
    Explained.
    SQL> select * from table(DBMS_XPLAN.DISPLAY);
    PLAN_TABLE_OUTPUT
    Plan hash value: 327232321
    | Id  | Operation                | Name | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
    |   0 | SELECT STATEMENT         |      | 99651 |  2530K|       |   489   (3)| 00:00:07 |
    |*  1 |  VIEW                    |      | 99651 |  2530K|       |   489   (3)| 00:00:07 |
    |*  2 |   WINDOW SORT PUSHED RANK|      | 99651 |  2432K|  7056K|   489   (3)| 00:00:07 |
    |   3 |    TABLE ACCESS FULL     | T    | 99651 |  2432K|       |    31   (7)| 00:00:01 |
    Predicate Information (identified by operation id):
       1 - filter("RN"<50000)
       2 - filter(ROW_NUMBER() OVER ( ORDER BY ROWID)<50000)875820,
    What are you doing with the results of the select to archive the table in two pieces? If the archive is in the DB in two seperate tables, multi table insert would be an option:
    SQL> create table archive_1 (data number);
    Table created.
    SQL> create table archive_2 (data number);
    Table created.
    SQL> explain plan for insert when mod(rn, 2) = 0 then into archive_2 (data) values (data)
      2  else into archive_1 (data) values(data)
      3  select rownum as rn, data
      4  from t;
    Explained.
    SQL> select * from table(DBMS_XPLAN.DISPLAY);
    PLAN_TABLE_OUTPUT
    Plan hash value: 828723766
    | Id  | Operation             | Name      | Rows  | Bytes | Cost (%CPU)| Time     |
    |   0 | INSERT STATEMENT      |           | 99651 |  2530K|    31   (7)| 00:00:01 |
    |   1 |  MULTI-TABLE INSERT   |           |       |       |            |          |
    |   2 |   INTO                | ARCHIVE_2 |       |       |            |          |
    |   3 |   INTO                | ARCHIVE_1 |       |       |            |          |
    |   4 |    VIEW               |           | 99651 |  2530K|    31   (7)| 00:00:01 |
    |   5 |     COUNT             |           |       |       |            |          |
    |   6 |      TABLE ACCESS FULL| T         | 99651 |  1265K|    31   (7)| 00:00:01 |
    SQL> insert when mod(rn, 2) = 0 then into archive_2 (data) values (data)
      2  else into archive_1 (data) values(data)
      3  select rownum as rn, data
      4  from t;
    100000 rows created.Another option would be to use the last digit of rowid to split the table into two groups, but they will not be equal sized.
    SQL> explain plan for select *
      2  from t
      3  where substr(rowid, length(rowid), 1) = upper(substr(rowid, length(rowid), 1))
      4  or substr(rowid, length(rowid), 1) in ('0', '1', '2', '3', '4');
    Explained.
    SQL> select * from table(DBMS_XPLAN.DISPLAY);
    PLAN_TABLE_OUTPUT
    Plan hash value: 2153619298
    | Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
    |   0 | SELECT STATEMENT  |      | 59025 |  1441K|    98  (71)| 00:00:02 |
    |*  1 |  TABLE ACCESS FULL| T    | 59025 |  1441K|    98  (71)| 00:00:02 |
    Predicate Information (identified by operation id):
       1 - filter(SUBSTR(ROWIDTOCHAR(ROWID),LENGTH(ROWIDTOCHAR(ROWID)),1)='0
                  ' OR SUBSTR(ROWIDTOCHAR(ROWID),LENGTH(ROWIDTOCHAR(ROWID)),1)='1' OR
                  SUBSTR(ROWIDTOCHAR(ROWID),LENGTH(ROWIDTOCHAR(ROWID)),1)='2' OR
                  SUBSTR(ROWIDTOCHAR(ROWID),LENGTH(ROWIDTOCHAR(ROWID)),1)='3' OR
                  SUBSTR(ROWIDTOCHAR(ROWID),LENGTH(ROWIDTOCHAR(ROWID)),1)='4' OR
                  SUBSTR(ROWIDTOCHAR(ROWID),LENGTH(ROWIDTOCHAR(ROWID)),1)=UPPER(SUBSTR(ROW
                  IDTOCHAR(ROWID),LENGTH(ROWIDTOCHAR(ROWID)),1)))
    Note
       - dynamic sampling used for this statement
    23 rows selected.
    SQL> explain plan for select *
      2  from t
      3  where substr(rowid, length(rowid), 1) <> upper(substr(rowid, length(rowid), 1))
      4  and substr(rowid, length(rowid), 1) not in ('0', '1', '2', '3', '4');
    Explained.
    SQL> select * from table(DBMS_XPLAN.DISPLAY);
    PLAN_TABLE_OUTPUT
    Plan hash value: 2153619298
    | Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
    |   0 | SELECT STATEMENT  |      | 40627 |   991K|    41  (30)| 00:00:01 |
    |*  1 |  TABLE ACCESS FULL| T    | 40627 |   991K|    41  (30)| 00:00:01 |
    Predicate Information (identified by operation id):
       1 - filter(SUBSTR(ROWIDTOCHAR(ROWID),LENGTH(ROWIDTOCHAR(ROWID)),1)<>'
                  0' AND SUBSTR(ROWIDTOCHAR(ROWID),LENGTH(ROWIDTOCHAR(ROWID)),1)<>'1' AND
                  SUBSTR(ROWIDTOCHAR(ROWID),LENGTH(ROWIDTOCHAR(ROWID)),1)<>'2' AND
                  SUBSTR(ROWIDTOCHAR(ROWID),LENGTH(ROWIDTOCHAR(ROWID)),1)<>'3' AND
                  SUBSTR(ROWIDTOCHAR(ROWID),LENGTH(ROWIDTOCHAR(ROWID)),1)<>'4' AND
                  SUBSTR(ROWIDTOCHAR(ROWID),LENGTH(ROWIDTOCHAR(ROWID)),1)<>UPPER(SUBSTR(RO
                  WIDTOCHAR(ROWID),LENGTH(ROWIDTOCHAR(ROWID)),1)))
    Note
       - dynamic sampling used for this statement
    23 rows selected.
    SQL> select count(*)
      2  from t
      3  where substr(rowid, length(rowid), 1) = upper(substr(rowid, length(rowid), 1))
      4  or substr(rowid, length(rowid), 1) in ('0', '1', '2', '3', '4');
      COUNT(*)
         59242
    SQL> select count(*)
      2  from t
      3  where substr(rowid, length(rowid), 1) <> upper(substr(rowid, length(rowid), 1))
      4  and substr(rowid, length(rowid), 1) not in ('0', '1', '2', '3', '4');
      COUNT(*)
         40758
    EDIT:
    I realized that I screwed up above. In hind sight I don't know what I was thinking. I was attempting to use X = upper(X) to find the upper case characters A-Z. So the two queries to split rows based on the last character of rowid are not right. I don't have time to fix now, but wanted to leave a note of warning.
    Edited by: Shannon Severance on Jul 29, 2011 1:34 AM

  • Split one row into multiple columns

    Hi,
    Data in one CLOB column in a table storing with delimiter, ##~~##. Ex. ##~~##abc##~~##defgh##~~##ijklm##~~##nopqr (data starts with delimiter). Please help me to split the data into multiple rows like below and it should be in the same order.
    abc
    defgh
    ijklm
    nopqr
    I am using Oracle 11g.
    Thanks.

    Thanks Hoek for your response. Before posting my question in the forum, I tried similar query. It is working with one character as delimiter.
    with test as (select 'ABC,DEF,GHI,JKL,MNO' str from dual )
    select regexp_substr (str, '[^,]+', 1, rownum) split
    from test
    connect by level <= length (regexp_replace (str, '[^,]+')) + 1;
    Above query is giving correct result by fetching 5 rows. I have modified the query like below...
    with test as (select 'ABC,,,DEF,,,GHI,,,JKL,,,MNO' str from dual )
    select regexp_substr (str, '[^,,,]+', 1, rownum) split
    from test
    connect by level <= length (regexp_replace (str, '[^,,,]+')) + 1;
    Above query resulting 13 rows and last 8 rows are nulls. Number of null rows are increasing, if I increase number of characters in delimiter. Could you please tell me how to avoid those null rows.
    Thanks.

  • How is it possible to split the table cells in Pages, Version 5.1

    How is it possible to split the table cells in Pages, Version 5.1?

    This is a feature removed in the change from Pages 09 to Pages 5.0.1.
    If you need this facility, revert to Pages 09.  If you upgraded to 5.0.1, then the earlier version is still in your Applications folder in a folder called iWork.

  • Need to split the output into files

    Hi,
    I have a query regarding splitting the output into different files. Please help to resolve that.
    I have have select query query...
    SELECT INDEX_NAME FROM DBA_INDEXES WHERE TABLE_NAME=<Table Name>;
    If it returns less than 4 indexes then we have create one table and have to move those into the files.
    For example...
    File_1.sql
    ====
    index1
    index2
    index3
    If select statement returns more than 4 indexes then we have create 4 files and have to splict those indexes and has to move to those 4 files.
    For example....
    If select statement returns 13 records then...
    File_1.sql File_2.sql File_3.sql File_4.sql
    ===== ====== ======= =======
    index1 index4 index7 index10
    index2 index5 index8 index11
    index3 index6 index9 index12
    index13
    Index no need to be in order in any file and any file can I extra index in it.
    Can be ok if we have any procedure or shell script. Please help me on this?
    We are using 10.2.0.1 oracle db. Please let me know if you need any thing else?
    Thanks
    Pathan

    Are you trying to put the output from SQL reports in different files?
    Some reporting tools can do this.
    You have a couple of options to do this.
    Some reporting tools support the functinality to write to different files.
    Another way is to write a PL/SQL procedure using UTL_FILE, which can open multiple files based on your conditions and to write to them as you need to.
    An older, less elegant solution is to write nested SQL*PLUS scripts spooling to different files with the queries you need. A top level script would invoke the others, something like (untested)
    --in first script
    @subscript1
    @subscript2
    --in subscript1.sql
    spool whatever.lst
    select *
       from dual;
    ...

  • Split a large table into multiple packages - R3load/MIGMON

    Hello,
    We are in the process of reducing the export and import downtime for the UNICODE migration/Conversion.
    In this process, we have identified couple of large tables which were taking long time to export and import by a single R3load process.
    Step 1:> We ran the System Copy --> Export Preparation
    Step 2:> System Copy --> Table Splitting Preparation
    We have created a file with the large tables which are required to split into multiple packages and where able to create a total of 3 WHR files for the following table under DATA directory of main EXPORT directory.
    SplitTables.txt (Name of the file used in the SAPINST)
    CATF%2
    E071%2
    Which means, we would like each of the above large tables to be exported using 2 R3load processes.
    Step 3:> System Copy --> Database and Central Instance Export
    During the SAPInst process at Split STR files screen , we have selected the option 'Split Predefined Tables' and select the file which has predefined tables.
    Filename: SplitTable.txt
    CATF
    E071
    When we started the export process, we haven't seen the above tables been processed by mutiple R3load processes.
    They were exported by a Single R3load processes.
    In the order_by.txt file, we have found the following entries...
    order_by.txt----
    # generated by SAPinst at: Sat Feb 24 08:33:39 GMT-0700 (Mountain
    Standard Time) 2007
    default package order: by name
    CATF
    D010TAB
    DD03L
    DOKCLU
    E071
    GLOSSARY
    REPOSRC
    SAP0000
    SAPAPPL0_1
    SAPAPPL0_2
    We have selected a total of 20 parallel jobs.
    Here my questions are:
    a> what are we doing wrong here?
    b> Is there a different way to specify/define a large table into multiple packages, so that they get exported by multiple R3load processes?
    I really appreciate your response.
    Thank you,
    Nikee

    Hi Haleem,
    As for your queries are concerned -
    1. With R3ta , you will split large tables using WHERE clause. WHR files get generated. If you have mentioned CDCLS%2 in the input file for table splitting, then it generates 2~3 WHR files CDCLS-1, CDCLS-2 & CDCLS-3 (depending upon WHERE conditions)
    2. While using MIGMON ( for sequencial / parallel export-import process), you have the choice of Package Order in th e properties file.
      E.g : For Import - In the import_monitor_cmd.properties, specify
    Package order: name | size | file with package names
        orderBy=/upgexp/SOURCE/pkg_imp_order.txt
       And in the pkg_imp_txt, I have specified the import package order as
      BSIS-7
      CDCLS-3
      SAPAPPL1_184
      SAPAPPL1_72
      CDCLS-2
      SAPAPPL2_2
      CDCLS-1
    Similarly , you can specify the Export package order as well in the export properties file ...
    I hope this clarifies your doubt
    Warm Regards,
    SANUP.V

  • Split the mileage into VAT and non VAT applicable -Travel Expenses

    Dear all,
    I need help from you in cofiguring the travel expenses for Input VAT i.e  to split the mileage into VAT and non VAT applicable so that we can claim reimbursement from the govt. so how can we get this on the Travel Expenses form.
    Pl. I need help on this.
    Regards,
    Sushma.

    Dear Dominic,
    Thank you for your suggestion, Could you pl. tell me where Can I create the additional Line Item, In which Transaction code it is? I can't able to see this additional line Item in T-code: PRFI or in TRIP.
    Pl. suggest me the way, it is very urgent.
    Thanks in advance,
    Sushma.

  • Split a string into multiple internal tables

    Hi all,
    I need to split a string based internal table into multiple internal tables based on some sub strings in that string based internal table...
    High priority help me out...
    eg...
    a | jhkhjk | kljdskj |lkjdlj |
    b | kjhdkjh | kldjkj |
    c | jndojkok |
    d |
    this data which is in the application server file is brought into a internal table as a text. Now i need to send 'a' to one internal table, 'b' to one internal table, so on... help me
    <Priority downgraded>
    Edited by: Suhas Saha on Oct 12, 2011 12:24 PM

    Hi pradeep,
    eg...
    a | jhkhjk | kljdskj |lkjdlj |
    b | kjhdkjh | kldjkj |
    c | jndojkok |
    d |
    As per your statement "Now i need to send 'a' to one internal table, 'b' to one internal table"
    Do you want only a to one internal table and b to one internal table
    OR
    Do you want the whole row of the internal table i mean
    a | jhkhjk | kljdskj |lkjdlj | to 1 internal table
    Having the case of an internal table which is of type string,
    1) Loop through the internal table.    LOOP AT lt_tab INTO lwa_tab.
    2) Ge the work area contents and get the first char wa_tab-string+0(1)
    3)   FIELD-SYMBOLS: <t_itab> TYPE ANY TABLE.
      w_tabname = p_table.
      CREATE DATA w_dref TYPE TABLE OF (w_tabname).
      ASSIGN w_dref->* TO <t_itab>.
    Follow the link
    http://www.sap-img.com/ab030.htm
    http://www.sapdev.co.uk/tips/dynamic-structure.htm
    and then based on the sy-tabix values you will get that many number of internal table
           <FS> = wa_tab-string+0(1)
          append  <FS>
    OR
    USE SPLIT statement at the relevant seperator
    revert for further clarification
    Thanks
    Sri
    Edited by: SRIKANTH P on Oct 12, 2011 12:36 PM

  • Why is it when i update my status on facebook from iohone it splits the updates into two differents boxes with some funky symbol. I have uninstall facebook and installed it over and it still does it. only the facebook IPHONE app.

    why is it when i update my status on facebook from iphone it splits the updates into two differents boxes with some funky symbols at the beginning.. I have uninstall facebook and installed it over and it still does it. only the facebook IPHONE app where it says to update staus text to FBOOK  i have already update my phone too.
    if i go on the facebook site and update there through a brower on iphone it will work fine just cant us IPHONE mobile upload,  . But its a pain of not using my IPHONE APP for facebook cause it does that.

    The warranty entitles you to complimentary phone support for the first 90 days of ownership.

  • When importing a cd it splits the album into separate individual tracks instead of 1 album with numerouse tracks - how do I get them all together

    When I import a CD from the Apple Mac drive it splits the cd into numerous single tracks in itunes instead of 1 album with all the tracks. How can I get it to import to the one place. I did try importing the same cd on a friends apple mac to see if it did the same thing and it imported the cd as 1 album with all tracks in there so I can't understand why it's separating them all.

    This happens mostly when you import a compilation or a CD that is not noted in the Gracenote Database.
    How to change back in one Album:
    Mark all titles of that album (shift or cmd click)
    Right click and choose "Get info"
    Fill in the wanted name in "Album" and "Album Artist*"
    Drag&Drop the wanted Album Art to the little window down right in that pane.
    iTunes group and sort albums by that two entry's in the info pane. If the CD is not listed in the database but the titels, iTunes split the album to fit the titles to eventually matching albums of the artists.
    Cheers - Lupunus
    * If you import a compilation, choose "various artits" for the Album Artist field.
    Message was edited by: lupunus

  • Is there a way to force the cursor into a string control when a vi is called

    In a .vi I'm wrighting I need to input a new serail number at the beginning of each run. Is there a way to force the cursor into the string control box every time the start screen returns? eliminating the need for the operator to move the mouse around and click.
    I would like to THANK all that have replied to my questions in the past. It has been a big help!
    Thanks
    TeBlues

    ah, problem solved.  what a community.
    Message Edited by Space_Flight on 11-20-2006 10:08 AM
    Attachments:
    keyfocus.jpg ‏83 KB

  • I have a huge file which is in GB and I want to split the video into clip and export each clip individually. Can you please help me how to split and export the videos to computer? It will be of great help!!

    I have a huge file which is in GB and I want to split the video into clip and export each clip individually. Can you please help me how to split and export the videos to computer? It will be of great help!!

    video
    What version of Premiere Elements do you have and on what computer operating system is it running?
    Please review the following workflow.
    ATR Premiere Elements Troubleshooting: PE11: Project Assets Organization for Scene and Highlight Grabs from Collection o…
    But please also determine if your project goal is supported by
    a. format of your source
    and
    b. computer resources
    More later based on details that you will post.
    ATR

Maybe you are looking for